Постоянная нормальная ориентация с 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);
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
и облако справа было вычислено впоследствии.
(К вашему сведению: любой, у кого есть такая репутация, может свободно редактировать этот ответ и добавить "!" Выше, чтобы встроить фактическое изображение, чтобы оно не было просто ссылкой.)