PCL利用RANSAC自行拟合分割平面

利用PCL中分割算法、算法

 pcl::SACSegmentation<pcl::PointXYZ> seg;dom

,不利用法线参数,只根据模型参数获得的分割面片,与想象的面片差距很大,ui

 1  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
 2   pcl::PointIndices::Ptr inliers (new pcl::PointIndices ());
 3   // 建立分割对象
 4   pcl::SACSegmentation<pcl::PointXYZ> seg;
 5   // 可选
 6   seg.setOptimizeCoefficients (true);
 7   // 必选
 8   seg.setModelType (pcl::SACMODEL_PLANE);
 9   seg.setMethodType (pcl::SAC_RANSAC);
10   seg.setMaxIterations (1000);
11   seg.setDistanceThreshold (0.05);

后我采用RANSAC拟合的方法,进行面片的分割spa

 1     std::vector<int> inliers;    //存储局内点集合的点的索引的向量
 2     
 3     //进行RANSAC平面拟合
 4     pcl::SampleConsensusModelPlane<PointT>::Ptr    model_p(new pcl::SampleConsensusModelPlane<PointT>(cloud));        //针对平面模型的对象
 5     pcl::RandomSampleConsensus<PointT> ransacP(model_p);
 6     ransacP.setDistanceThreshold(.1);        //与平面距离小于0.1的点做为局内点考虑
 7     ransacP.computeModel();                    //执行随机参数估计
 8     ransacP.getInliers(inliers);                //存储估计所得的局内点
 9     pcl::copyPointCloud<PointT>(*cloud, inliers, *cloud_in);    //复制估算模型的全部局内点到cloud_in中
10     pcl::io::savePCDFile("./data/seg_RAN/RANSAC_building_1.pcd", *cloud_in);

获得:指针

以后我想迭代的进行面片拟合后分割出来,在索引的地方遇到了问题code

因而想出来一个比较笨的办法:对象

 

1 for (int i = 0; i < cloud->points.size(); i++)
2     {
3         std::vector<int>::iterator iter = find(inliers.begin(), inliers.end(), i);
4         if (iter == inliers.end())
5         {
6             cloud_out->points.push_back(cloud->points.at(i));
7         }
8     }

 

等同于本身写了一个分割的方法。blog

中间遇到的问题有:索引

点云的索引、有序点云与无序点云的写入、智能指针未实例化问题、ci

如今仍未搞明白PCL中的索引的使用方法。例如:PointIndices、 ExtractIndices 等

若有了解的小伙伴但愿告知、互帮互助、共同进步!

2019-04-12  19:04:34

相关文章
相关标签/搜索