点云植物分离代码解析 - 基于PassThrough滤波器
这段代码的作用是将点云中的植物部分从地面部分分离出来。具体操作如下:
-
根据上一步中得到的平面模型,将点云中平面部分提取出来,存储到一个新的点云数据结构中('sac_plane')。
-
从平面部分中获取最小和最大的点,以确定平面的高度(y值)范围。
-
使用PassThrough滤波器,将点云中高度在平面高度范围内的部分(即植物部分)提取出来,存储到另一个新的点云数据结构中('cloud_plant')。其中,'setInputCloud()'指定输入点云,'setFilterFieldName()'指定要过滤的字段(这里是y坐标),'setFilterLimits()'指定过滤范围,'setNegative()'指定是否保留范围内的点。最后,调用'filter()'方法进行过滤操作。
代码示例:
PointCloud<PointXYZRGB>::Ptr sac_plane(new PointCloud<PointXYZRGB>);
copyPointCloud<PointXYZRGB>(*cloud_plot_area, inliers, *sac_plane);
//3.Obtain soil plane parameters, y coordinate value
PointXYZRGB gc_minPt, gc_maxPt;
getMinMax3D(*sac_plane, gc_minPt, gc_maxPt);
PassThrough<PointXYZRGB> pass2;
pass2.setInputCloud(cloud_truing);
pass2.setFilterFieldName('y');
pass2.setFilterLimits(gc_maxPt.y, gc_maxPt.y + 1);
pass2.setNegative(false);
pass2.filter(*cloud_plant);
代码解释:
PointCloud<PointXYZRGB>::Ptr sac_plane(new PointCloud<PointXYZRGB>);:创建一个名为'sac_plane'的点云指针,用于存储提取出来的地面部分。copyPointCloud<PointXYZRGB>(*cloud_plot_area, inliers, *sac_plane);:将输入点云中属于平面部分的点复制到'sac_plane'中。getMinMax3D(*sac_plane, gc_minPt, gc_maxPt);:获取'sac_plane'中的最小点和最大点,以确定平面的高度范围。PassThrough<PointXYZRGB> pass2;:创建一个PassThrough滤波器对象。pass2.setInputCloud(cloud_truing);:设置输入点云为'cloud_truing'。pass2.setFilterFieldName('y');:设置要过滤的字段为'y'坐标。pass2.setFilterLimits(gc_maxPt.y, gc_maxPt.y + 1);:设置过滤范围为地面高度到地面高度+1。pass2.setNegative(false);:设置保留范围内的点。pass2.filter(*cloud_plant);:执行过滤操作,将过滤后的结果存储到'cloud_plant'中。
总结:
这段代码利用PassThrough滤波器,基于平面模型提取点云中的植物部分,并将其存储到一个新的点云数据结构中。该方法简单高效,能够有效地实现点云植物分离。
原文地址: https://www.cveoy.top/t/topic/oXff 著作权归作者所有。请勿转载和采集!