Sum*_*Sun 6 c++ algorithm point-clouds point-cloud-library
我正在使用 PCL 来计算点云的法线。在Meshlab中,法线就是正确的,虽然所有法线都是从外到内,但我把它们全部颠倒一下就正确了。
但当我使用 PCL 执行此操作时,某些法线的方向是错误的,如左图所示。
为了更有意义,下面是使用 meshlab 和 PCL 重建的表面,使用 PCL 估计的法线,我无法得到正确的结果。

我的代码如下,我的示例 .ply 数据在这里,我的模型可以在这里找到,我尝试更改半径、邻居数量和质心位置,但无法解决此问题。
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;
Run Code Online (Sandbox Code Playgroud)
也许我应该调整一些其他参数?或者改用更好的方法?感谢您的关注!
小智 3
您的视点位于对象的中间,而不是检测到点的位置。所有法线都朝向(或远离)视点,其想法是该点后面有一个固体物体。就你的情况而言,情况并非如此。
您可以将视点设置为实际检测到点的位置,并根据该点确定它们的方向。
如果这不是您的情况的选择,您可以尝试执行类似的操作。
选择邻居搜索的半径
从起点选择一个随机点,检查法线是否是您想要的方式并将其标记为完成(可能从云或点索引中删除)。
然后选择其邻居并检查法线是否相同(点积为正)。如果没有,请翻转它们并将其标记为完成。
找到这些点的邻居并对所有点重复。
这应该可以解决问题。调整半径,确保正确。您不想从“手指”的相对侧选择点。
AFAIK PCL 没有真正可靠的方法来确定组合“完整”扫描的法向方向。