PCL估计某些部分的法线方向错误

时间:2017-11-22 06:33:47

标签: c++ algorithm point-cloud-library point-clouds

我正在使用PCL来计算点云的法线。使用Meshlab,法线是正确的,虽然所有法线都是从外到内,但在我将它们全部反转之后它将是正确的。

但是当我使用PCL执行此操作时,左图所示的某些法线的方向是错误的。

enter image description here

为了更有意义,下面是使用meshlab和PCL重建的表面,通过PCL估算的法线,我无法得到正确的结果。 enter image description here

我的代码如下,我的样本.ply数据是here,我的模型可以在这里找到,我试图改变半径,邻居数量和质心位置,但是不能解决这个问题

cout << "begin normal estimation" << endl;
NormalEstimationOMP<PointXYZ, Normal> ne;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);
ne.setNumberOfThreads(8);
ne.setInputCloud(filtered);
ne.setKSearch(15);
ne.setRadiusSearch(5);

Eigen::Vector4f centroid;
compute3DCentroid(*filtered, centroid);
ne.setViewPoint(centroid[0], centroid[1], centroid[2]);

PointCloud<Normal>::Ptr cloud_normals (new PointCloud<Normal>());
ne.compute(*cloud_normals);
cout << "normal estimation complete" << endl;

也许我应该调整一些其他参数?或者切换到更好的方法?谢谢你的关注!

1 个答案:

答案 0 :(得分:3)

您的视点位于对象的中间,而不是位于检测到点的位置。所有法线都朝向(或远离)视点,其思想是在点后面有一个实体对象。在你的情况下,情况并非如此。

您可以将视点设置为实际检测到点的位置,并根据该点对其进行定向。

如果这不是您的选择,您可以尝试做这样的事情。

  1. 选择邻居搜索的半径

  2. 从哪里开始选择一个随机点并检查是否正常 你想要的方式并将其标记完成(也许从中移除) 云或pointIndices)。

  3. 然后选择其邻居并检查     如果法线是相同的方式(点积为正)。如果没有,请翻转并标记它们。

  4. 找到这些点的邻居并重复所有点。

  5. 这应该可以解决问题。使用半径进行游戏以确保正确。您不想从“手指”的相对两侧选择点。

    AFAIK PCL没有一种真正可靠的方法来确定组合“完整”扫描的正常方向。