如何在保持点云顺序的同时对点云进行下采样? (PCL C++)

How to downsample a point cloud while maintaining its order? (PCL C++)

我想使用 pcl 库提供的直通过滤器对传入的点云进行下采样,并保持给定点云的顺序。 我目前的解决方案如下:

using point_type_colored = pcl::PointXYZRGB;
using point_cloud_colored = pcl::PointCloud<point_type_colored>;

point_cloud_colored::Ptr registration_util::pass_through_filter(
     const point_cloud_colored::Ptr& cloud_in, double p_t_x_min, double p_t_x_max,
     double p_t_y_min, double p_t_y_max, double p_t_z_min, double p_t_z_max)
{
     point_cloud_colored::Ptr filtered_cloud(new point_cloud_colored);
     *filtered_cloud = *cloud_in;
     pcl::PassThrough<point_type_colored> pass_filter;

     //filter x boundaries
     if (p_t_x_min != p_t_x_max)
     {
         pass_filter.setInputCloud(filtered_cloud);
         pass_filter.setFilterFieldName("x");
         pass_filter.setFilterLimits(p_t_x_min, p_t_x_max);
         pass_filter.filter(*filtered_cloud);
     }

     //filter y boundaries
     if (p_t_y_min != p_t_y_max)
     {
         pass_filter.setInputCloud(filtered_cloud);
         pass_filter.setFilterFieldName("y");
         pass_filter.setFilterLimits(p_t_y_min, p_t_y_max);
         pass_filter.filter(*filtered_cloud);
     }

     //filter z boundaries
     if (p_t_z_min != p_t_z_max)
     {
         pass_filter.setInputCloud(filtered_cloud);
         pass_filter.setFilterFieldName("z");
         pass_filter.setFilterLimits(p_t_z_min, p_t_z_max);
         pass_filter.filter(*filtered_cloud);
     }

     return std::move(filtered_cloud);
}

输入云具有定义的宽度 (= 1280) 和高度 (=720),这意味着点云是有序的。但是输出的云只有 1 的高度和 92160 的宽度,这意味着云由于下采样而失去了顺序。

如何保持输入云的原始顺序? 如果可能的话,对于随机过滤等其他下采样方法是否有类似的解决方案?

您正在查找函数 setKeepOrganized。提供 true 会将每个筛选点设置为 NaN 而不是删除该点。

您也可以使用 setUserFilterValue 更改该值以将其设置为,但保留它 NaN 的好处是其他 PCL 算法不会在其算法中考虑这些点.