PCL点云分割——平面模型分割

时间:2024-05-22 13:52:41

PCL中segmentation模块及类介绍:

PCL点云分割——平面模型分割

 

点云分割实验程序:

 

源码:

 

// RANSAC.cpp: 定义控制台应用程序的入口点。

//

#include "stdafx.h"      //标准应用程序框架

#include <pcl/sample_consensus/method_types.h>     //随机参数估计方法头文件

#include <pcl/sample_consensus/model_types.h>      //模型定义头文件

#include <pcl/segmentation/sac_segmentation.h>     //基于采样一致性分割的类的头文件

using namespace std;

using namespace pcl;

int main()

{

       pcl::PointCloud<pcl::PointXYZ>cloud;            //实例化点云模板PointCloud类

       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[1].z = 2.0;

       cloud.points[5].z = 5.0;

       cloud.points[7].z = -1.0;

       cloud.points[12].z = -3.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);   //创建分割时所需要的模型系数对象coefficients

       pcl::PointIndices::Ptr inliers(new pcl::PointIndices);     //创建存储内点的点索引对象inliers

       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());   //输入点云

       //引发分割实现,存储内点到inliers,并记录模型参数到coefficients

       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);

}

 

问题:

严重性

代码

说明

项目

文件

禁止显示状态

错误

C2664

“std::map<pcl::SacModel,unsigned int,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>::map(const std::map<_Kty,_Ty,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> &)”: 无法将参数 1 从“const char [178]”转换为“

RANSAC

d:\pcl\pcl 1.8.1\include\pcl-1.8\pcl\sample_consensus\model_types.h

96

 

解决方法:

error C4996: 'pcl::SAC_SAMPLE_SIZE': PCL1.8问题汇总 https://blog.****.net/wokaowokaowokao12345/article/details/51287011

error C2664: 不能将参数 1 从“const char [17]”转换为“LPCTSTR” https://blog.****.net/xgf415/article/details/53493380

https://dsqiu.iteye.com/blog/1697308

注释掉             //     PCL_DEPRECATED("This map is deprecated and is kept only to prevent breaking "

       //            "existing user code. Starting from PCL 1.8.0 model sample size "

       //            "is a protected member of the SampleConsensusModel class"),

 

std::map

 

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。

 

std::map的用法 https://blog.****.net/wcc27857285/article/details/78289175

https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html

 

STL

 

STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。

 

运行结果:

PCL点云分割——平面模型分割 

 

 

参考文献:

PCL点云分割(1) https://blog.****.net/yaningli/article/details/78031149