Я хочу уменьшить количество входящих облаков точек с помощью сквозного фильтра, предоставляемого библиотекой 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), что означает, что облако точек упорядочено. Но выходное облако имеет высоту только единицу и ширину 92160, что означает, что облако потеряло свой порядок из-за понижающей дискретизации.
Как сохранить исходный порядок входного облака? Если возможно, существуют ли аналогичные решения для других методов понижающей дискретизации, таких как случайная фильтрация?