一、分享给有需要的人,代码质量勿喷
void boundary(const std::string &pathPC, const std::string &pathBoundary,
const double &rNormal, const double &rBoundary, const double &thrAngle)
{
//read point cloud
pcl::PointCloud<pcl::PointXYZ>::Ptr pc(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile(pathPC, *pc);
/* normal */
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normalEst;
pcl::search::KdTree<pcl::PointXYZ>::Ptr kd_tree(new pcl::search::KdTree<pcl::PointXYZ>);
normalEst.setInputCloud(pc);
normalEst.setSearchMethod(kd_tree);
normalEst.setRadiusSearch(rNormal);
pcl::PointCloud<pcl::Normal>::Ptr pcNormal(new pcl::PointCloud<pcl::Normal>);
normalEst.compute(*pcNormal);
/* boundary */
pcl::BoundaryEstimation<pcl::PointXYZ, pcl::Normal, pcl::Boundary> boundaryEst;
boundaryEst.setInputCloud(pc);
boundaryEst.setInputNormals(pcNormal);
boundaryEst.setRadiusSearch(rBoundary);
boundaryEst.setAngleThreshold(thrAngle);
boundaryEst.setSearchMethod(kd_tree);
pcl::PointCloud<pcl::Boundary> boundaries;
boundaryEst.compute(boundaries);
pcl::PointCloud<pcl::PointXYZ>::Ptr pcBoundary(new pcl::PointCloud<pcl::PointXYZ>);
for (int i = 0; i < pc->points.size(); i++)
{
if (boundaries[i].boundary_point > 0)
{
pcBoundary->push_back(pc->points[i]);
}
}
//write boundary
pcl::io::savePCDFileASCII(pathBoundary, *pcBoundary);
}
二、效果
![](https://i-blog.csdnimg.cn/blog_migrate/fa5b8abb36573fda023b953be6b4a193.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/b34eadc3c4fc8909116aed9b0d9ddebe.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/89fd0db3ab1dc358f5a4d7b1c240e7e8.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/1588e39f27e651313973636f9c6123b8.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/9884b22f1ab8dbdba073306b279e4b2e.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/753e9b827cede3c19037d52ffdb0a936.jpeg)