PCL专栏目录及须知
注意:本例参数难调,又没有独创算法。只适合于测试数据中相当规整的平面,实际操作中相当之不好用。
本例只是为了展示pcl::ExtractPolygonalPrismData类的用法,不做相关解释及说明。
1.用途
用于分割得到平面,及平面上的物体。
2.完整代码
#include <pcl/io/pcd_io.h>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_polygonal_prism_data.h>
#include <pcl/surface/convex_hull.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
int main()
{
/****************分割得到平面上的物体********************/
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 源点云
pcl::io::loadPCDFile("D:/code/csdn/data/unit.pcd", *cloud);
pcl::PointCloud<pcl::PointXYZ>::Ptr resultCloud(new pcl::PointCloud<pcl::PointXYZ>); // 结果点云
// 分割得到平面上的物体
// 提取平面
// 直通滤波,删除平面上点
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFiltered(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PassThrough<pcl::PointXYZ> filtered;
filtered.setInputCloud(cloud);
filtered.setFilterFieldName("z"); // 滤波维度
filtered.setFilterLimits(122.0, 125.0); // 滤波阈值
filtered.filter(*cloudFiltered);
// 计算凸包
pcl::ConvexHull<pcl::PointXYZ> hull; // 凸包(即凸多边形)
hull.setInputCloud(cloudFiltered); // 输入点云
hull.setDimension(2); // 凸包维度
std::vector<pcl::Vertices> polygons; // 保存凸包顶点
pcl::PointCloud<pcl::PointXYZ>::Ptr surface_hull(new pcl::PointCloud<pcl::PointXYZ>); // 该点云用于描述凸包形状
hull.reconstruct(*surface_hull, polygons); // 计算2D凸包
// 分割得到平面上的物体
pcl::ExtractPolygonalPrismData<pcl::PointXYZ> segmentation;
segmentation.setInputCloud(cloud);
segmentation.setInputPlanarHull(surface_hull);
segmentation.setHeightLimits(0, 50); // 距离平面模型的距离阈值(超过这个阈值范围就剔除)
pcl::PointIndices::Ptr segmentationIndices(new pcl::PointIndices); // 分割结果
segmentation.segment(*segmentationIndices);
// 提取索引外点
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud);
extract.setIndices(segmentationIndices);
extract.setNegative(true); //false: 筛选Index对应的点,true:过滤获取Index之外的点
extract.filter(*resultCloud);
/****************展示********************/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ExtractPolygonalPrismData"));
// viewer->addPointCloud<pcl::PointXYZ>(cloudFiltered, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloudFiltered, 255, 0, 0), "cloudFiltered");
viewer->addPointCloud<pcl::PointXYZ>(resultCloud, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(resultCloud, 0, 255, 0), "resultCloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return (0);
}
3.结果展示
原始点云。
提取后点云