PCL:在平面模型上构造凸凹多边形

#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/filters/project_inliers.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/surface/concave_hull.h>
#include <pcl/visualization/pcl_visualizer.h>
#pragma comment(lib,"User32.lib")
#pragma comment(lib, "gdi32.lib")
int
main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>),
		cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>),
		cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PCDReader reader;

	reader.read("table_scene_mug_stereo_textured.pcd", *cloud);

	//建立直通滤波器,消除杂散的NaN点
	pcl::PassThrough<pcl::PointXYZ> pass;
	pass.setInputCloud(cloud);   //设置输入点云
	pass.setFilterFieldName("z");//设置分隔字段为z坐标
	pass.setFilterLimits(0, 1.1);//设置分割阈值范围,z轴上不在该范围的点过滤掉
	pass.filter(*cloud_filtered);
	std::cerr << "PointCloud after filtering has: "
		<< cloud_filtered->points.size() << " data points." << std::endl;

	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
	pcl::PointIndices::Ptr inliers(new pcl::PointIndices);//inliers指针存储点云分割后的结果

														  // Create the segmentation object
	pcl::SACSegmentation<pcl::PointXYZ> seg;//创建分割对象
											// 可选设置
	seg.setOptimizeCoefficients(true);     //设置优化系数,该参数为可选设置
										   // 必须设置
	seg.setModelType(pcl::SACMODEL_PLANE); //设置分割模型为SACMODEL_PLANE 平面模型
	seg.setMethodType(pcl::SAC_RANSAC);    //设置采样一致性估计方法模型为SAC_RANSAC
	seg.setDistanceThreshold(0.01);        //设置距离阈值为0.01, 即与估计平面模型的距离小于0.01m的点都为内点inliers

	seg.setInputCloud(cloud_filtered);     //设置输入点云为滤波后的点云
	seg.segment(*inliers, *coefficients);  //分割结果:平面模型
	std::cerr << "PointCloud after segmentation has: "
		<< inliers->indices.size() << " inliers." << std::endl;

	// Project the model inliers
	pcl::ProjectInliers<pcl::PointXYZ> proj; //创建点云投影滤波对象
	proj.setModelType(pcl::SACMODEL_PLANE); //设置投影模型为SACMODEL_PLANE
	proj.setInputCloud(cloud_filtered);     //设置输入点云为滤波后的点云
	proj.setModelCoefficients(coefficients);//将估计得到的平面模型coefficients参数设置为投影平面模型系数
	proj.filter(*cloud_projected);          //将滤波后的点云投影到平面模型中得到投影后的点云cloud_projected
	std::cerr << "PointCloud after projection has: "
		<< cloud_projected->points.size() << " data points." << std::endl;

	// Create a Concave Hull representation of the projected inliers
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_hull(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::ConcaveHull<pcl::PointXYZ> chull;//创建多边形提取对象
	chull.setInputCloud(cloud_projected);//设置输入点云为投影后的点云cloud_projected
	chull.setAlpha(0.1);                 //设置Alpha值为0.1
	chull.reconstruct(*cloud_hull);      //重建提取创建凹多边形

	std::cerr << "Concave hull has: " << cloud_hull->points.size()
		<< " data points." << std::endl;

	pcl::PCDWriter writer;
	writer.write("table_scene_mug_stereo_textured_hull.pcd", *cloud_hull, false);

	pcl::visualization::PCLVisualizer::Ptr viewer0(new pcl::visualization::PCLVisualizer("hull"));
	viewer0->addPointCloud(cloud, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloud, 0, 0, 255), "cloud");
	viewer0->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "cloud");
	cout << "click q key to quit the visualizer and continue!!" << endl;
	//viewer0->spin();

	pcl::visualization::PCLVisualizer::Ptr viewer1(new pcl::visualization::PCLVisualizer("hull"));
	viewer1->addPointCloud(cloud_hull, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloud_hull, 0, 255, 0), "cloud_hull");
	viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "cloud_hull");
	cout << "click q key to quit the visualizer and continue!!" << endl;
	viewer1->spin();

	return (0);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值