PCL中segmentation模块及类介绍:
点云分割实验程序:
源码:
// 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点云分割(1) https://blog.****.net/yaningli/article/details/78031149