我目前正在使用PointCloudLibrary从点云(.pcd文件中)创建点网格。 我使用以下代码生成它们:
pcl::PolygonMesh::Ptr meshPoisson::process(pcl::PointCloud<pcl::PointNormal>::Ptr input)
{
(...)
pcl::Poisson<pcl::PointNormal> mesh;
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
pcl::PolygonMesh::Ptr triangles(new pcl::PolygonMesh);
tree2->setInputCloud(input);
mesh.setInputCloud(input);
mesh.setSearchMethod(tree2);
mesh.setDepth(m_depth);//4 low testing
mesh.setScale(m_scale);//1.0
mesh.setSamplesPerNode(5.0);
//this line is reached
mesh.reconstruct(*triangles);
//this line is never reached
(...)
return triangles;
}
在某些点云上,此代码永远不会从 reconstruct 函数返回。 我所有的点云都被过滤并且没有NaN值。
如您所见,我正在使用 PointNormal 数据类型,因此所有点都具有法线。我也检查了它们,它们具有好值(归一化而不是NaN)。
我希望PCL能够正确实现,因此该错误必须在我的代码中。
Edit1:事实证明它与泊松算法本身有关。删除 setScale 方法可解决此问题。我仍然不知道是什么原因造成的,因为我没有学习泊松算法。