我现在需要对点云数据提取特征线,比如边缘线之类的。
pcl库对于点云数据的点特征提取有很多对应的方法,但是没查到关于线特征提取的。
想问一下大佬们,pcl支持特征线提取吗,是不是我找资料的时候找错了关键词。
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
pcl点云数据的线特征提取的方案
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- 颜早早 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就是最后要的结果
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报无用 3
悬赏问题
- ¥15 metadata提取的PDF元数据,如何转换为一个Excel
- ¥15 关于arduino编程toCharArray()函数的使用
- ¥100 vc++混合CEF采用CLR方式编译报错
- ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
- ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
- ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
- ¥50 如何openEuler 22.03上安装配置drbd
- ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
- ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
- ¥15 Windows11, backspace, enter, space键失灵