Apprentissage PCL de la bibliothèque de nuages de points: description et extraction des fonctionnalités (FPFH)

Apprentissage PCL de la bibliothèque de nuages ​​de points: description et extraction des fonctionnalités (FPFH)

Descripteur d'histogramme d'entité ponctuelle rapide (FPFH)

Sachant qu'il y a n points dans le nuage de points P, alors la complexité théorique de calcul de son histogramme d'entités ponctuelles (PFH) est (Onk2), où k est le voisinage pris en compte lors du calcul du vecteur d'entités pour chaque point p dans le nuage de points P Quantité. Pour les applications en temps réel ou quasi en temps réel, le calcul des histogrammes d'entités ponctuelles (PFH) des nuages ​​de points denses est un goulot d'étranglement majeur en termes de performances. Voici une forme simplifiée de la méthode de calcul PFH, appelée FPFH (Fast Point Feature Histograms). FPFH réduit la complexité de calcul à (Onk), mais conserve toujours la plupart des fonctionnalités de PFH.

La différence entre PFH et FPFH

Les principales différences entre les méthodes de calcul PFH et FPFH sont résumées comme suit:

  1. FPFH ne compte pas les paramètres de calcul de tous les points voisins du point entièrement interconnecté, comme le montre la figure, de sorte que certaines paires de points importantes peuvent être manquées, et ces paires manquantes peuvent capturer la géométrie autour du point de requête Les fonctionnalités contribuent.
  2. Le modèle d'entité PFH est un rayon de voisinage précis autour du point de requête, et FPFH comprend également des paires de points supplémentaires en dehors du rayon r (mais dans 2r)
  3. En raison de la manière de calculer le nouveau poids, FPFH combiné avec la valeur SPFH, recapture les informations géométriques des paires de points importants adjacents;
  4. Parce que la complexité globale de FPFH est considérablement réduite, FPFH peut être utilisé dans des applications en temps réel;
  5. En décomposant le triplet, l'histogramme synthétisé est simplifié. Autrement dit, générez simplement des histogrammes d'entités séparés d, dessinez chaque dimension d'entité séparément et connectez-les ensemble.

Estimer le descripteur FPFH

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/time.h>
#include <pcl/features/fpfh.h>    //FPFH
#include <pcl/visualization/pcl_plotter.h>//显示描述子 
using namespace pcl;

int main(int argc, char **argv)
{
       //读取点云
       pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
       if (pcl::io::loadPCDFile<pcl::PointXYZ>("steelCoil.pcd", *cloud) == -1)
       {
              PCL_ERROR("Cloudn't read file!");
              system("pause");
              return -1;
       }

       //估计法线
       pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
       ne.setInputCloud(cloud);
       pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
       ne.setSearchMethod(tree);
       pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
       ne.setRadiusSearch(0.6);      //使用半径在查询点周围0.6范围内的所有邻元素
       ne.compute(*cloud_normals);     //计算法线

        //PHFH
       pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> fpfh;
       fpfh.setInputCloud(cloud);
       fpfh.setInputNormals(cloud_normals);
       pcl::search::KdTree<PointXYZ>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZ>);//创建一个空的kd树表示法
       fpfh.setSearchMethod(tree1);//输出的数据集
       pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfhs(new pcl::PointCloud<pcl::FPFHSignature33>());
       //使用半径内0.8里面范围所有元素
       fpfh.setRadiusSearch(0.8);//使用半径必须大于估计法线时使用的半径
       fpfh.compute(*fpfhs);
       //显示某点的fhfh特征
       pcl::visualization::PCLPlotter plotter;
       plotter.addFeatureHistogram<pcl::FPFHSignature33>(*fpfhs,"fpfh", 60);       

       //可视化
       pcl::visualization::PCLVisualizer viewer("PCL Viewer");
       viewer.setBackgroundColor(0.0, 0.0, 0.0);
       viewer.addPointCloudNormals<pcl::PointXYZ,pcl::Normal>(cloud, cloud_normals, 1, 0.4, "normals");
       viewer.addPointCloud(cloud,"cloud1");
       viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2, "cloud1");
       while (!viewer.wasStopped())
       {
              plotter.plot();
              viewer.spinOnce(100);
       }
       return 0;
}

Résultats estimés

Comme le montre la figure, FPFH contient 33 données

Insérez la description de l'image ici

Publié 22 articles originaux · Likes2 · Visites 1157

Je suppose que tu aimes

Origine blog.csdn.net/qinqinxiansheng/article/details/105499329
conseillé
Classement