我正在尝试使用此tutorial
中的 pcl :: GreedyProjectionTriangulation 对Point Cloud Library中的点云进行三角测量问题: 但是结果我得到了 PolyMesh ,只有很少的面孔(见下图): Sorry, I can't publish images
这是我的代码:
//Calculate normals
pcl::NormalEstimation<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(80);
cout << "Computing normals...\n";
n.compute(*normals);
// Concatenate the XYZ and normal fields*
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
// Create search tree*
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
tree2->setInputCloud(cloud_with_normals);
// Initialize objects
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
pcl::PolygonMesh triangles;
// Set the maximum distance between connected points (maximum edge length)
gp3.setSearchRadius(0.1);
// Set typical values for the parameters
gp3.setMu(2.5);
gp3.setMaximumNearestNeighbors(150);
gp3.setMaximumSurfaceAngle(M_PI ); // 180 degrees
gp3.setMinimumAngle(M_PI / 18); // 10 degrees
gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees
gp3.setNormalConsistency(false);
// Get result
gp3.setInputCloud(cloud_with_normals);
gp3.setSearchMethod(tree2);
cout << "reconstruct\n";
gp3.reconstruct(triangles);
我尝试设置 SearchRadius 的更大值(1对0.1)但在运行时收到此警告:
没有足够的邻居被认为:ffn或sfn超出范围!考虑增加 g nnn _...将R = 23433设置为BOUNDARY! 没有考虑足够的邻居:R = 23480的来源超出范围!考虑 增加nnn _... 边缘邻居的社区规模增加请求数量:24 来源的邻居规模增加请求数量:68
并且多边形的数量是低钢。
问题:那么,我该如何从点云创建好的PolyMesh呢?
答案 0 :(得分:2)
以下提示可以解决您的问题:
MovingLeastSquares
或BilateralUpsampling
,具体取决于您的需要。你的云会更密集,导致表面重建后的洞更少。setMaximumNearestNeighbors
将避免运行时警告。