c++ - 如何在保持其顺序的同时对点云进行下采样?(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 算法不会将这些点用于其算法。
推荐阅读
- jquery - 使用 jquery 访问 Django 表单数据
- scroll - 使用 Ionic 3 Firestore 和 Observables 进行分页
- python - NameError:未定义全局名称“用户”?
- javascript - 从 mongo 查询特定数据,而不是整个记录
- php - php include 语句的 PHP 加载页面问题
- javascript - 在不同的框中按 Enter 时防止按钮上的 onclick 事件触发
- javascript - 如何通过单击javascript中的项目符号来显示图像?
- php - 如何在 PHP 文件中获取当前 wordpress 主题的页眉和页脚?
- ios - 滚动后在 UITableView 单元格中无法再次点击 Facebook 原生广告
- javascript - jQuery on textarea selectionchange