颜早早 2018-10-09 17:34 采纳率: 100%
浏览 8945
已采纳

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

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

  • 写回答

3条回答 默认 最新

  • 颜早早 2018-10-17 00: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就是最后要的结果
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 宝塔面板一键迁移使用不了
  • ¥15 求一个按键录像存储到内存卡的ESP32CAM代码
  • ¥15 如何单独修改下列canvas推箱子代码target参数?,插入图片代替其形状,就是哪个绿色的圆圈每关用插入的图片替代
  • ¥20 四叉树的创建和输出问题
  • ¥15 javaweb连接数据库,jsp文件加载不出来
  • ¥15 matlab关于高斯赛德尔迭代的应用编撰。(相关搜索:matlab代码|迭代法)
  • ¥15 损失匹配问题,求解答
  • ¥15 3500常用汉字书法体检测数据集下载
  • ¥15 odoo17在制造模块或采购模块良品与次品如何分流和在质检模块下如何开发
  • ¥15 Qt音乐播放器的音乐文件相对路径怎么写
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部