Bagaimana cara melakukan downsample point cloud sambil mempertahankan urutannya? (PCL C++)

Saya ingin menurunkan sampel pointclouds yang masuk dengan menggunakan filter passthrough yang disediakan oleh perpustakaan pcl dan juga menjaga urutan cloud yang diberikan. Solusi saya saat ini adalah sebagai berikut:

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);
}

Awan masukan memiliki lebar yang ditentukan (= 1280) dan tinggi (=720) yang berarti titik awan diurutkan. Namun output cloud hanya memiliki tinggi satu dan lebar 92160 yang berarti cloud kehilangan tatanannya karena downsampling.

Bagaimana cara menjaga urutan asli dari input cloud? Jika memungkinkan, apakah ada solusi serupa untuk metode downsampling lain seperti pemfilteran acak?


person Michael    schedule 08.02.2021    source sumber
comment
Hai MichaelN, selamat datang.. Saya tidak yakin apakah saya memahami masalah Anda. Kodenya terlihat baik-baik saja, Anda mengatakan hanya ada satu titik (piksel?) yang difilter dari titik cloud asli Anda? Mungkin batas min-maks Anda disetel terlalu sempit? Bisakah Anda memberi tahu lebih banyak tentang apa yang ingin Anda capai dengan mempertahankan ketinggian aslinya. Anda sedang memfilter.. jika itu adalah gambar, Anda dapat mis. buat gambar kosong dengan ukuran yang sama dan letakkan piksel (yang difilter) di tempat yang tepat, tapi.. gambar bukan awan titik.. gambar adalah keluaran..   -  person Goodies    schedule 08.02.2021
comment
@Goodies Hai, terima kasih atas balasan Anda. Maaf atas artikulasi saya yang buruk (saya agak baru mengenal PCL). Maksud saya adalah urutan awan titik masuk dirusak oleh filter karena ketinggian awan keluaran hanya 1 setelah proses. Namun jika Anda mengabaikan urutannya, point cloud baik-baik saja. Ini hanya tentang pesanan.   -  person Michael    schedule 09.02.2021


Jawaban (1)


Anda mencari fungsi setKeepOrganized. Memberikan true akan menyetel setiap titik yang difilter ke NaN alih-alih menghapus titik tersebut.

Anda juga dapat mengubah nilai yang akan ditetapkan dengan setUserFilterValue, tetapi mempertahankannya NaN telah keuntungan bahwa algoritma PCL lain tidak akan mempertimbangkan poin ini untuk algoritma mereka.

person kanstar    schedule 10.02.2021
comment
Saya benar-benar mengabaikan hal itu. Terima kasih! - person Michael; 10.02.2021