与PCL一致的正常方向

时间:2016-11-18 12:53:50

标签: orientation point-cloud-library point-clouds normals

使用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);

Point cloud triangulation with normals

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找的代码可以在Difference of Normals Tutorial中找到。具体来说,行

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

(仅供参考:任何有此声誉的人都应该随时编辑此答案并添加上面的内容以嵌入实际图片,这样它不仅仅是一个链接。)