baidu_27304211 2023-06-03 10:05 采纳率: 26.7%
浏览 91
已结题

PCD点云排序和分割

请教点云问题,在对建筑物点云投影到水平面并进行轮廓提取后,点云如下图所示,点云格式为pcd,同时可注意到pcd点云内部默认的排序方式是无序的,现在我想把下面这个点云按照下面两种方式操作,如您能实现其中一个操作也请不吝赐教,必有偿感谢:
示例点云在下面网盘链接中
链接:https://pan.baidu.com/s/1N-s6VMrTxF-h5M2Wm9TJ5w?pwd=jo35
提取码:jo35
--来自百度网盘超级会员V2的分享

原始点云:__

img

1. 从其中某一个点开始,把点云顺序按照顺时针或逆时针进行排列__

img

2. 对点云进行分割,分割成上下左右四个部分,分割是是以右上、右下、左上、左下四个点为边界__

img

本例的点云仅为示例,希望能找到对方形(操作1和2)、圆形建筑(操作1)等都适用的算法,最好是用C++/PCL实现,其他语言也可以,十分感谢。

  • 写回答

4条回答 默认 最新

  • 智达教育‍ Java领域优质创作者 2023-06-03 21:47
    关注

    随机采样一致性 球模型 和 平面模型
    分割平面 平面模型分割 基于随机采样一致性
    圆柱体分割 依据法线信息分割 平面上按 圆柱体模型分割得到圆柱体点云
    欧氏距离分割 平面模型分割平面 平面上按 聚类得到 多个点云团
    基于 法线差值 和 曲率差值 的 区域聚类分割算法
    基于颜色的 区域聚类分割算法 pcl::RegionGrowingRGB

    PCL(Point Cloud Library)是一个常用的点云处理库,它提供了丰富的点云处理算法和工具。在PCL中,点云排序和分割也是常见的操作。

    PCL点云排序可以使用pcl::PointCloud类中的sort函数进行实现,该函数可以按照点的坐标、距离等属性进行排序。例如,可以按照点到原点的距离进行排序:

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    // 加载点云数据
    pcl::io::loadPCDFile<pcl::PointXYZ> ("cloud.pcd", *cloud);
    // 按照点到原点的距离进行排序
    std::sort(cloud->points.begin(), cloud->points.end(), [](const pcl::PointXYZ& a, const pcl::PointXYZ& b){
        return std::sqrt(a.x*a.x + a.y*a.y + a.z*a.z) < std::sqrt(b.x*b.x + b.y*b.y + b.z*b.z);
    });
    
    

    PCL点云分割可以使用PCL中的各种分割算法进行实现,常见的分割算法包括基于平面模型的分割、基于聚类的分割等。例如,可以使用基于平面模型的分割算法将点云分割成平面和非平面两部分:

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    // 加载点云数据
    pcl::io::loadPCDFile<pcl::PointXYZ> ("cloud.pcd", *cloud);
    // 创建分割对象
    pcl::SACSegmentation<pcl::PointXYZ> seg;
    seg.setOptimizeCoefficients (true);
    seg.setModelType (pcl::SACMODEL_PLANE);
    seg.setMethodType (pcl::SAC_RANSAC);
    seg.setMaxIterations (1000);
    seg.setDistanceThreshold (0.01);
    // 执行分割
    pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
    pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
    seg.setInputCloud (cloud);
    seg.segment (*inliers, *coefficients);
    // 提取平面和非平面两部分点云
    pcl::ExtractIndices<pcl::PointXYZ> extract;
    pcl::PointCloud<pcl::PointXYZ>::Ptr plane_cloud (new pcl::PointCloud<pcl::PointXYZ>);
    extract.setInputCloud (cloud);
    extract.setIndices (inliers);
    extract.setNegative (false);
    extract.filter (*plane_cloud);
    pcl::PointCloud<pcl::PointXYZ>::Ptr nonplane_cloud (new pcl::PointCloud<pcl::PointXYZ>);
    extract.setNegative (true);
    extract.filter (*nonplane_cloud);
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月6日
  • 修改了问题 6月3日
  • 创建了问题 6月3日

悬赏问题

  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站