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

6
我正在使用PCL计算点云的法线。在Meshlab中,法线如右图所示,尽管所有法线都是从外到内的,但在反转它们之后就会变得正确。
但是当我使用PCL时,一些法线的方向是错误的,如左图所示。

enter image description here

为了更好地理解,下面是使用Meshlab和PCL重构的表面,其法线由PCL估计,但我无法得到正确的结果。 {{link1:enter image description here}}
我的代码如下,我的样本.ply数据在{{link2:此处}},我的模型可以在此处找到。我已经尝试更改半径、邻居数和质心位置,但无法解决这个问题。
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个回答

3
您的视点位于物体的中间位置而不是从点被检测到的位置。所有法线都朝向(或远离)视点,并认为点后面有一个实体物体。但在您的情况下,这并非如此。
如果可以,请将视点设置为实际检测到点的位置,并根据该点进行取向。
如果在您的情况下无法实现此选项,则可以尝试执行以下操作:
1. 选择邻域搜索的半径 2. 从某个随机点开始,检查其法线是否符合要求,并标记为已完成(也许从云或点索引中删除)。 3. 然后选择其相邻点,并检查法线是否相同(点积为正)。如果不是,则翻转它们并标记为已完成。 4. 找到这些点的邻居并重复以上步骤,直到所有点都处理完毕。
这样应该可以解决问题。调整半径以使其正确。您不想从“手指”的相反侧选择点。
据我所知,PCL没有真正强大的方法来确定组合“完整”扫描的法线方向。

是的,视角确实是问题所在,但我仍然找不到适合我的云的正确视角。我认为你的第二个建议应该可行,但这需要做很多工作,所以我最终决定自己计算法线。感谢你的建议! - Summer Sun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接