Регистрация облака точек с помощью pcl

Хорошо, вот в чем проблема. Я перешел по ссылке, указанной здесь, для регистрации пары облаков точек.

У меня есть пара вопросов:

1) Поскольку второе облако точек выровнено с рамкой первого, координаты точек в первом облаке точек должны оставаться неизменными в конечном облаке точек, верно?

2) Есть ли способ сопоставить целевые точки с выровненными точками в конечных координатах. Другими словами, например, у меня есть два облака точек pc1 и pc2. pc1 имеет 3 точки A, B и C, а pc2 имеет 4 точки W, X, Y и Z. После регистрации последние облака точек содержат точки A, B, C (поскольку они должны оставаться неизменными) и W ' , X ', Y' и Z '. Мой вопрос: есть ли способ узнать, что W 'соответствует W в целевом облаке, X' - X и т. Д. И т. Д.? Кроме того, есть ли способ наоборот? Я имею в виду, учитывая W, как узнать, что он соответствует (то есть W ')?

Заранее спасибо.


person bluechill    schedule 22.05.2014    source источник


Ответы (1)


В pcl регистрация сама по себе не меняет ни облаков. Результатом регистрации является преобразование из кадра исходного облака в кадр целевого облака.

В вашей ссылке регистрация осуществляется в pairAlign (). Он постепенно запускается

points_with_normals_src = reg_result;
reg.align(reg_result);

каждый раз получая как reg_result преобразованное облако points_with_normals_src, и

//accumulate transformation between each Iteration
Ti = reg.getFinalTransformation () * Ti;

накапливающая трансформация из предыдущих шагов.

преобразование (по какой-то причине они хотят применить обратное преобразование к цели, чтобы преобразовать ее в исходный кадр) и результирующее слияние выровненных облаков происходит только после цикла регистраций:

// Transform target back in source frame
pcl::transformPointCloud (*cloud_tgt, *output, targetToSource);
...
//add the source to the transformed target
*output += *cloud_src;

Если я правильно вас понял, вашему вопросу дается точка A в cloud_tgt найти его изображение в объединенном выходном облаке? (Правильно?)

Если все, что вам нужно, это найти преобразованные координаты точки A, тогда это просто:

pcl::PointXYZ transformed_a = targetToSource * a;

Если вы хотите найти индекс преобразованного A в выходном облаке, это немного сложнее: хотя вы можете просто перечислить все точки в выходном облаке и сравнить их координаты с transformed_a, этот подход будет заметной проблемой производительности, если вы собираетесь чтобы найти соответствие для многих точек из вашего целевого облака. В этом случае вы предпочтете использовать pcl :: search :: KdTree (см. http://docs.pointclouds.org/trunk/a02948.html)

person datjko    schedule 23.05.2014
comment
Спасибо! Как оказалось, есть более простой способ сопоставления. Облако точек - это не что иное, как список точек. Когда мы выравниваем точки, порядок точек в облаке никогда не меняется. Это означает, что точка X остается неизменной до и после выравнивания (но, конечно, она переместилась). Индекс не меняется. - person bluechill; 23.05.2014