点群ライブラリPCL学習:条件付きで制約された平面セグメンテーション(SACMODEL_NORMAL_PARALLEL_PLANE)

pclを使用して点群空間で平面を抽出する場合、通常はSACMODEL_PLANEモデルを使用し、抽出にはサンプリング整合性アルゴリズム(RANSAC)アルゴリズムを使用します。環境がより複雑な場合、SACMODEL_NORMAL_PARALLEL_PLANEモデルを使用して平面の法線方向を制約し、平面の点群をより正確にセグメント化できます。

カプセル化された機能

パラメータ:(入力点群、通常の法線、抽出された平面点群、フィルターされた点群、平面パラメーター、点からモデルまでの最大許容距離、反復回数)

void normalPlaneSeg(pcl::PointCloud<pcl::PointXYZ>::Ptr Inputcloud,Eigen::Vector3f axis, pcl::PointCloud<pcl::PointXYZ>::Ptr filtercloud, pcl::PointCloud<pcl::PointXYZ>::Ptr filtercloud1,
pcl::ModelCoefficients::Ptr coefficients, double Threshold, int Iterationscount=1000)
{
       typedef pcl::PointXYZ PointT;
       //定义一些对象
       pcl::NormalEstimation<PointT,pcl::Normal> ne;  //法线估计对象
       pcl::SACSegmentationFromNormals<PointT,pcl::Normal> seg;    //分割对象
       pcl::PCDWriter writer;                 //PCD文件读取对象
       pcl::ExtractIndices<PointT>extract;   //点提取对象
       pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>());
       //定义一些变量
       pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
       pcl::PointCloud<PointT>::Ptr cloud_filtered(new pcl::PointCloud<PointT>);
       pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2(new pcl::PointCloud<pcl::Normal>);
       pcl::PointIndices::Ptr inliers(new pcl::PointIndices);

       ne.setSearchMethod(tree);
       ne.setInputCloud(Inputcloud);
       ne.setKSearch(5);
       ne.compute(*cloud_normals);
       
       seg.setOptimizeCoefficients(true);           //设置对估计模型优化
       seg.setModelType(pcl::SACMODEL_NORMAL_PARALLEL_PLANE);//设置分割模型为带约束的平面
       seg.setMethodType(pcl::SAC_RANSAC);          //参数估计方法
       seg.setNormalDistanceWeight(0.1);            //设置表面法线权重系数
       seg.setMaxIterations(Iterationscount);       //设置迭代的最大次数,默认是10000
       seg.setDistanceThreshold(Threshold);         //设置内点到模型的距离允许最大值
       seg.setInputCloud(Inputcloud);
       seg.setInputNormals(cloud_normals);
       seg.segment(*inliers, *coefficients);
       seg.setAxis(axis);
       seg.setEpsAngle(PI / 120);//设置角度误差
       
       extract.setInputCloud(Inputcloud);
       extract.setIndices(inliers);
       extract.setNegative(false);//设置成true是保存滤波后剩余的点,false是保存在区域内的点
       extract.filter(*filtercloud);
       extract.setNegative(true);//设置成true是保存滤波后剩余的点,false是保存在区域内的点
       extract.filter(*filtercloud1);
} 

円柱上の点群の上面を抽出します
ここに画像の説明を挿入

元の記事を22件公開 Likes2 訪問数1157

おすすめ

転載: blog.csdn.net/qinqinxiansheng/article/details/105497232