人工智能 | 计算机视觉 | 深度学习

0%

PCL系列——平面模型分割

PCL系列

说明

代码下载

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#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章