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

Как сохранить исходный порядок входного облака? Если возможно, существуют ли аналогичные решения для других методов понижающей дискретизации, таких как случайная фильтрация?


person Michael    schedule 08.02.2021    source источник
comment
Привет, MichaelN, добро пожаловать .. Я не уверен, что понимаю вашу проблему. Код выглядит нормально, вы говорите, что есть только одна точка (пиксель?), Отфильтрованная из вашего исходного облака точек? Может быть, ваши минимальные и максимальные пределы установлены слишком узко? Не могли бы вы рассказать еще о том, чего вы пытаетесь достичь, сохраняя исходную высоту. Вы фильтруете ... если это изображение, вы могли бы, например, создайте пустое изображение того же размера и просто поместите (отфильтрованные) пиксели в нужное место, но .. изображения не являются облаками точек .. изображения выводятся ..   -  person Goodies    schedule 08.02.2021
comment
@Goodies Привет, спасибо за ответ. Извините за плохую артикуляцию (я новичок в PCL). Я имею в виду, что упорядочение входящих облаков точек нарушается фильтром, поскольку высота выходного облака составляет только 1 после процесса. Но если вы проигнорируете порядок, облака точек будут в порядке. Все дело в порядке.   -  person Michael    schedule 09.02.2021


Ответы (1)


Вам нужна функция setKeepOrganized. Если указать true, для каждой отфильтрованной точки будет установлено значение NaN вместо удаления точки.

Вы также можете изменить значение, чтобы установить его, с помощью setUserFilterVal, сохраняя его _ преимущество в том, что другие алгоритмы PCL не будут учитывать эти моменты в своем алгоритме.

person kanstar    schedule 10.02.2021
comment
Я совершенно не заметил этого. Спасибо! - person Michael; 10.02.2021