PCL用RANSAC法求点云平面并标注平面点

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

void main()
{
     
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());//点云对象
	if (pcl::io::loadPCDFile("save.pcd", *cloud))
	{
     
		std::cerr << "ERROR: Cannot open file " << std::endl;
		return;
	}
	//创建一个模型参数对象,用于记录结果
	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
	//inliers表示误差能容忍的点 记录的是点云的序号
	pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
	// 创建一个分割器
	pcl::SACSegmentation<pcl::PointXYZ> seg;
	// Optional,这个设置可以选定结果平面展示的点是分割掉的点还是分割剩下的点。
	seg.setOptimizeCoefficients(true);
	// Mandatory-设置目标几何形状
	seg.setModelType(pcl::SACMODEL_PLANE);
	//分割方法:随机采样法
	seg.setMethodType(pcl::SAC_RANSAC);
	//设置误差容忍范围,也就是我说过的阈值
	seg.setDistanceThreshold(0.01);
	//输入点云
	seg.setInputCloud(cloud);
	//分割点云,获得平面和法向量
	seg.segment(*inliers, *coefficients);
	//打印出法向量
	std::cout << "x:" << coefficients->values[0] << endl;
	std::cout << "y:" << coefficients->values[1] << endl;
	std::cout << "z:" << coefficients->values[2] << endl;
	//平面点获取
	pcl::PointCloud<pcl::PointXYZ>::Ptr clicked_points_3d(new pcl::PointCloud<pcl::PointXYZ>);
	for (int i = 0; i < inliers->indices.size(); ++i)
	{
     
		clicked_points_3d->points.push_back(cloud->points.at(inliers->indices[i]));
	}
	//显示对象创建
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("viewer"));
	//全局点云添加
	viewer->addPointCloud(cloud, "data");
	//将平面点标为红色添加
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(clicked_points_3d, 255, 0, 0);
	std::string cloudName="plane";
	viewer->addPointCloud(clicked_points_3d, red, cloudName);
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, cloudName);
	//保持窗体,知道显示窗体退出
	while (!viewer->wasStopped())
	{
     
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
}

你可能感兴趣的:(PCL,PCL,平面)