Постоянная нормальная ориентация с помощью PCL

Оценка нормалей точек в облаке точек с помощью PCL работает хорошо, но я получаю странное изменение ориентации в определенной части облака (см. Снимок экрана, нормали - желтые линии). Конечно, я могу перебирать массив нормалей и исправлять его, но, может быть, есть лучший способ сделать это напрямую с помощью PCL, на лету? Использование нормалей, ориентированных на точку обзора, не вариант, потому что поверхность цилиндрическая, поэтому ожидается, что нормали будут указывать во всех направлениях вокруг этой оси в конце.

Вот код для нормальной оценки. В основном фрагмент из официального руководства:

pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> n;
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud(cloud_);
n.setInputCloud(cloud_);
n.setSearchMethod(tree);
n.setKSearch(10);
n.compute(*normals);

Триангуляция облака точек с нормалями


person Alexander    schedule 18.11.2016    source источник
comment
Привет, Александр, у меня такая же проблема. Вы смогли ее исправить?   -  person Bardo91    schedule 22.02.2017
comment
Привет. Не совсем. В итоге я сделал это вручную с помощью библиотеки OpenMesh, которая мне все равно нужна для других операций с сеткой.   -  person Alexander    schedule 23.02.2017
comment
Ok! Я сделаю то же самое. Большое тебе спасибо   -  person Bardo91    schedule 23.02.2017
comment
Можете ли вы объяснить, что вы делали с помощью библиотеки openmesh? Было бы неплохо либо несколько указателей в комментариях, либо самостоятельный ответ, если у вас есть хороший алгоритм.   -  person allo    schedule 10.04.2018


Ответы (1)


Я думаю, что код, который вы ищете, можно найти в Учебнике по различию норм < / а>. В частности, строки

pcl::NormalEstimationOMP<PointXYZRGB, PointNormal> ne;
...
ne.setViewPoint (std::numeric_limits<float>::max (), 
                 std::numeric_limits<float>::max (), 
                 std::numeric_limits<float>::max ());
...
ne.compute (*normals_large_scale);

Если функция setViewPoint перевернет нормали всего облака точек (а не только отдельной точки), если она вызывается перед функцией compute.

Например, на этом изображении облако слева было вычислено до вызова setViewPoint, а облако справа было вычислено после.

normals_orientation_vs_not

(К вашему сведению: любой, у кого есть такая репутация, должен смело редактировать этот ответ и добавлять '!' Выше, чтобы встроить фактическое изображение, чтобы оно не было просто ссылкой.)

person Matt    schedule 13.06.2018