• 点云切片的实现(PCL)C++


    一、实现逻辑

            1、通过PCL库的getMinMax3D得到xyz轴上的最大最小值;

            函数原型:

    pcl::getMinMax3D(const pcl::PointCloud<PointT> &cloud, POintT &min_pt, PointT &max_pt)

            2、设置切片厚度,计算某一轴方向上的切片数量,循环遍历该数量;

            3、通过PCL库的PassThrough对点云进行切片

            通过PassThrough的setFilterLimits设置切片范围。

            函数原型:

    setFilterLimits(const float &limit_min,const float &limit_max)

            由此便可通过循环遍历切片数量来设置切片范围,递进式对点云进行指定厚度的切片。

    二、代码实现

    1. //-----------------.h头文件部分-----------------//
    2. //读取点云的头文件
    3. #include <pcl/io/pcd_io.h>
    4. //点云切片的头文件
    5. #include <pcl/common/common.h>
    6. #include <pcl/filters/passthrough.h>
    7. //io流的头文件
    8. #include <iostream>
    9. //-----------------.cpp文件部分-----------------//
    10. //初始化一个点云
    11. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    12. //加载点云文件
    13. if(pcl::io::loadPCDFile("cloud.pcd",*cloud)==-1)
    14. {
    15. //此处cloud.pcd是你的点云文件
    16. }
    17. //初始化三个轴最大最小值的容器
    18. pcl::PointXYZ minValues;
    19. pcl::PointXYZ maxValues;
    20. //计算三个轴的最大最小值
    21. pcl::getMinMax3D(*cloud,minValues,maxValues);
    22. //选择x轴做切片
    23. double xMax = maxValues.x;
    24. double xMin = minValues.x;
    25. //设置切片厚度
    26. double sliceInterval = 0.5;
    27. //计算x轴方向的切片总数
    28. int sliceNum_x = floor((xMax-xMin)/sliceInterval)-1;
    29. //设置切片起始值
    30. double sliceBeginCoordinate = xMin;
    31. //初始化保存切片的点云
    32. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_Save(new pcl::PointCloud<pcl::PointXYZ>);
    33. //循环获取切片
    34. for(int i = 0; i<= sliceNum_x ;++i)
    35. {
    36. float min_value = sliceBeginCoordinate; //切片的起始值
    37. //给保存的点云命名
    38. std::ostringstream oss;
    39. oss << "cloud_section" << i << ".pcd";
    40. std::string slice_name = oss.str();
    41. //直通滤波对象
    42. pcl::PassThrough<pcl::PointXYZ> pass;
    43. pass.setInputCloud(cloud);
    44. pass.setFilterFieldName("x"); //选择x轴
    45. pass.setFilterLimits(min_value ,min_value + sliceInterval ) //切片范围
    46. pass.filter(*cloud_Save);
    47. //保存切片
    48. if(!cloud_Save->empty())
    49. {
    50. pcl::io::savePCDFile(slice_name ,*cloud_Save);
    51. cloud_Save->clear();
    52. }
    53. sliceBeginCoordinate = min_value + sliceInterval;
    54. }

    三、实现效果

            以上是切片实现的基础内容,如果需要配合上其它操作方式自行添加,例如使用QT+PCL对点云切片的可控操作;

  • 相关阅读:
    python多进程(二)一些基础属性和方法
    ClickHouse和Elasticsearch压测对比,谁才是yyds?
    iOS dSYM详解和分析crash,ips文件
    如何多号定时发朋友圈?
    C++ Qt开发:QItemDelegate自定义代理组件
    自动代码Copilot背后的模型
    搜索专题练习
    ppo-clip的本质以及它为什么是另一种ppo-KL-penalty
    8/11 二分图染色+KM算法变型+后缀数组+图论
    linux安装Keepalived
  • 原文地址:https://blog.csdn.net/qq_19319481/article/details/132709872