3 votes

Quel filtre pcl utiliser pour réduire l'échantillonnage d'un nuage de points ?

J'obtiens un nuage de points d'un lidar sur un robot de conduite autonome, mais c'est trop de données à traiter.

J'ai déjà implémenté un filtre de passage.

J'ai obtenu un très bon résultat et je me suis demandé s'il y avait d'autres filtres ou méthodes que je pourrais approfondir.

Bien sûr, je ne cherche pas quelque chose de spécifique mais plutôt une direction ou un conseil, parce que je suis assez nouveau dans la bibliothèque pcl et elle semble assez énorme.

Voici mon filtre maintenant :

    pcl::PointCloud<PointXYZIR>::Ptr cloudInput;
    cloudInput.reset(new pcl::PointCloud<PointXYZIR> (cloud_in));

    pcl::PointCloud<PointXYZIR>::Ptr cloudFiltered;
    cloudFiltered.reset(new pcl::PointCloud<PointXYZIR>);

    // Create the filtering object: downsample the dataset using a leaf size
    pcl::VoxelGrid<PointXYZIR> avg;
    avg.setInputCloud(cloudInput);
    avg.setLeafSize(0.25f, 0.25f, 0.25f);
    avg.filter(*cloudFiltered);

    //Filter object
    pcl::PassThrough<PointXYZIR> filter;
    filter.setInputCloud(cloudFiltered);

    filter.setFilterFieldName("x");
    filter.setFilterLimits(-100, 100);
    filter.filter(*cloudFiltered);

    filter.setFilterFieldName("y");
    filter.setFilterLimits(-100, 100);
    filter.filter(*cloudFiltered);

    cloud_out = *cloudFiltered;

2voto

tony497 Points 211

En fait, j'ai trouvé une solution, mais il n'y a pas de solution générale. Dans mon cas, et je pense que ce problème est très spécifique au nuage de points que vous allez obtenir et à ce que vous voulez en faire.

Le filtre passtrought est un moyen très efficace de réduire l'échantillonnage sans prendre trop de risques de perdre des données intéressantes.

http://pointclouds.org/documentation/tutorials/passthrough.php

J'ai ensuite testé StatisticalOutlierRemoval, qui est efficace mais pas pertinent dans mon cas.

http://pointclouds.org/documentation/tutorials/statistical_outlier.php

Maintenant, je déséchantillonne le nuage de points avec une fonction leafsize, puis je crée un kdtree pour filtrer les points par rayon. C'est à peu près la même quantité de calcul que pour le filtre passtrought, mais cela a plus de sens dans mon projet de le faire de cette façon.

 // Create the filtering object: downsample the dataset using a leaf size
    pcl::VoxelGrid<PointXYZIR> avg;
    avg.setInputCloud(cloudInput);
    avg.setLeafSize(0.25f, 0.25f, 0.25f);
    avg.filter(*cloudFiltered);

    //searchPoint
    PointXYZIR searchPoint = cloudFiltered->at(0) ;

    //result from radiusSearch()
    std::vector<int> pointIdxRadiusSearch;
    std::vector<float> pointRadiusSquaredDistance;

    //kdTree
    pcl::KdTreeFLANN<PointXYZIR> kdtree;
    kdtree.setInputCloud (cloudFiltered);
    kdtree.setSortedResults(true);

    if ( kdtree.radiusSearch (searchPoint, 100, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0 )
    {
        //delete every point in target
        for (size_t j = 0; j < pointIdxRadiusSearch.size (); ++j)
        {
            //is this the way to erase correctly???
            cloud_out.push_back(cloudFiltered->points[pointIdxRadiusSearch[j]]);
        }
    }

1voto

Sneaky Polar Bear Points 913

La grille de voxel au sous-échantillonnage devrait maintenir une assez bonne distribution des nuages tout en réduisant le nombre de points. Vous pouvez définir la taille des voxels dans chaque axe afin de maintenir autant ou aussi peu de résolution que vous le souhaitez. Chaque voxel supprimera tous les points qu'il contient et les remplacera par un seul point dont la moyenne sera calculée à partir des points supprimés. http://pointclouds.org/documentation/tutorials/voxel_grid.php#voxelgrid

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X