颜早早
2018-10-10 01:34
采纳率: 100%
浏览 7.7k
已采纳

pcl点云数据的线特征提取的方案

我现在需要对点云数据提取特征线,比如边缘线之类的。
pcl库对于点云数据的点特征提取有很多对应的方法,但是没查到关于线特征提取的。
想问一下大佬们,pcl支持特征线提取吗,是不是我找资料的时候找错了关键词。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 颜早早 2018-10-17 08:08
    已采纳

    忘了把找到的方法写出来了

     int arg_kNearest = 30;//一般这里的数值越高,最终边界识别的精度越好
        int arg_Angle = 144;//角度值,0-360
    
        pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
        pcl::PointCloud<pcl::Boundary> boundaries;//Boundary,表示点是否位于表面边界的描述的点结构
        pcl::BoundaryEstimation<pcl::PointXYZRGBA, pcl::Normal, pcl::Boundary> est; //BoundaryEstimation使用角度标准估计一组点是否位于表面边界上
        pcl::search::KdTree<pcl::PointXYZRGBA>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGBA>());
    
        //其中pcl::PointXYZ表示输入类型数据,pcl::Normal表示输出类型,且pcl::Normal前三项是法向,最后一项是曲率
        pcl::NormalEstimation<pcl::PointXYZRGBA, pcl::Normal> normEst;//NormalEstimation类,用于估计每个3D点的局部表面属性(表面法线和曲率)
        normEst.setInputCloud(input_cloud);
        normEst.setSearchMethod(tree);
        // normEst.setRadiusSearch(2);  //法向估计的半径
        normEst.setKSearch(9);  //法向估计的点数
        normEst.compute(*normals);
        cout << "normal size is " << normals->size() << endl;
    
        //normal_est.setViewPoint(0,0,0); //这个应该会使法向一致
        est.setInputCloud(input_cloud);
        est.setInputNormals(normals);
        //est.setAngleThreshold(M_PI *4/5);//默认是M_PI/2,  M_PI是180度
        est.setAngleThreshold(M_PI*(arg_Angle % 360) / 180);
        //est.setSearchMethod (pcl::search::KdTree<pcl::PointXYZ>::Ptr (new pcl::search::KdTree<pcl::PointXYZ>));
        est.setSearchMethod(tree);
        est.setKSearch(arg_kNearest);  
                                       //est.setRadiusSearch(everagedistance);  //搜索半径
        est.compute(boundaries);
    
        //pcl::PointCloud<pcl::PointXYZ> boundPoints;
        pcl::PointCloud<pcl::PointXYZRGBA>::Ptr boundPoints(new   pcl::PointCloud<pcl::PointXYZRGBA>);
        pcl::PointCloud<pcl::PointXYZRGBA> noBoundPoints;
        int countBoundaries = 0;
        for (int i = 0; i<input_cloud->size(); i++)
        {
            uint8_t x = (boundaries.points[i].boundary_point);
            int a = static_cast<int>(x); //该函数的功能是强制类型转换
            if (a == 1)
            {
                //  boundPoints.push_back(cloud->points[i]);
                (*boundPoints).push_back(input_cloud->points[i]);
                countBoundaries++;
            }
            else
                noBoundPoints.push_back(input_cloud->points[i]);
        } 
    //boundPoints就是最后要的结果
    
    点赞 评论
  • devmiao 2018-10-10 16:28
    点赞 评论

相关推荐 更多相似问题