PCL系列——平面模型分割

博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com


PCL系列

说明

代码下载

代码

#include <iostream>
#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/segmentation/sac_segmentation.h>	//随机样本一致性算法	分割方法

int
main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ> cloud; //创建点云对象,用于存储点云数据
	//填充点云数据
	cloud.width  = 15;
  cloud.height = 1;
  cloud.points.resize (cloud.width * cloud.height);

	//生成随机数据
	for (size_t i = 0; i < cloud.points.size (); ++i)
  {
    cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].z = 1.0;
  }

	//设置几个局外点
	cloud.points[0].z = 2.0;
	cloud.points[3].z = -2.0;
	cloud.points[6].z = 4.0;
	//显示点云数量和坐标信息
  std::cerr << "Point cloud data: " << cloud.points.size () <<" points" << std::endl;
	for (size_t i = 0; i < cloud.points.size (); ++i)
		std::cerr << "    " << cloud.points[i].x << " " 
							<< cloud.points[i].y << " " 
							<< cloud.points[i].z << std::endl;

	pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); //存储输出的模型的系数
	pcl::PointIndices::Ptr inliers (new pcl::PointIndices);	//存储内点,使用的点
	
	//创建分割对象
  pcl::SACSegmentation<pcl::PointXYZ> seg;
	//可选设置
  seg.setOptimizeCoefficients (true);
	//必须设置
	seg.setModelType (pcl::SACMODEL_PLANE); //设置模型类型,检测平面
  seg.setMethodType (pcl::SAC_RANSAC);		//设置方法【聚类或随机样本一致性】
  seg.setDistanceThreshold (0.01);
  seg.setInputCloud (cloud.makeShared ());
  seg.segment (*inliers, *coefficients);	//分割操作

	if (inliers->indices.size () == 0)//根据内点数量,判断是否成功
	{

    PCL_ERROR ("Could not estimate a planar model for the given dataset.");
		return (-1);
  }
	//显示模型的系数
  std::cerr << "Model coefficients: " << coefficients->values[0] << " " 
						<<coefficients->values[1] << " "
						<<coefficients->values[2] << " " 
						<<coefficients->values[3] <<std::endl;
	//显示估计平面模型过程中使用的内点
  std::cerr << "Model inliers: " << inliers->indices.size () << std::endl;
	for (size_t i = 0; i < inliers->indices.size (); ++i)
			std::cerr << inliers->indices[i] << "    " <<cloud.points[inliers->indices[i]].x << " "
								<<cloud.points[inliers->indices[i]].y << " "
								<<cloud.points[inliers->indices[i]].z << std::endl;
	return (0);
}

运行结果

这里写图片描述

参考

《点云库PCL学习教程》 14章

以下是一个基于PCL库的平面分割示例代码: ```c++ #include <iostream> #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/segmentation/sac_segmentation.h> int main(int argc, char** argv) { // 加载点云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("plane.pcd", *cloud); // 创建分割pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); pcl::PointIndices::Ptr inliers(new pcl::PointIndices); pcl::SACSegmentation<pcl::PointXYZ> seg; seg.setOptimizeCoefficients(true); seg.setModelType(pcl::SACMODEL_PLANE); seg.setMethodType(pcl::SAC_RANSAC); seg.setDistanceThreshold(0.01); // 执行分割 seg.setInputCloud(cloud); seg.segment(*inliers, *coefficients); // 输出分割结果 std::cerr << "Model coefficients: " << coefficients->values[0] << " " << coefficients->values[1] << " " << coefficients->values[2] << " " << coefficients->values[3] << std::endl; std::cerr << "Inliers: " << inliers->indices.size() << std::endl; for (std::size_t i = 0; i < inliers->indices.size(); ++i) std::cerr << inliers->indices[i] << " " << cloud->points[inliers->indices[i]].x << " " << cloud->points[inliers->indices[i]].y << " " << cloud->points[inliers->indices[i]].z << std::endl; return 0; } ``` 这个示例代码首先加载了一个点云文件,并创建了一个`SACSegmentation`对象作为分割器。然后通过设置模型类型以及分割方法类型等参数,最后执行了分割操作。最终输出了分割得到的平面模型系数以及属于该平面的点云索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值