Apprentissage PCL de la bibliothèque de nuages de points: reconnaissance de cluster basée sur le descripteur VFH (fonction vfh du modèle 1_extract)

J'ai récemment effectué la reconnaissance d'objets et je partagerai le processus de débogage avec vous. Il y a encore quelques différences entre ma tâche et le matériel pédagogique. Se situe principalement dans:

  1. Il suffit d'identifier la catégorie de l'objet, n'a pas besoin d'estimer la pose
  2. Mes données de nuage de points sont PointXYZ

Dans cet article, je présenterai l'extraction des fonctionnalités vfh en fonction du nuage de points du modèle

1. Donnez un nom au fichier modèle au format "model _ *. Pcd" et placez-le dans le dossier Data

Insérez la description de l'image ici
2. Estimez les caractéristiques vfh et enregistrez le fichier texte .pcd

#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/vfh.h>    //vFH
#include <pcl/visualization/pcl_plotter.h>//显示描述子
using namespace pcl; 

//vfh全局特性
int main(int argc, char **argv)
{
    for (int i = 0; i < 33;i++)
    {
        std::stringstream ss;
        ss<< "Data\\model_" << i << ".pcd";
        //读取点云
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); 
        if (pcl::io::loadPCDFile<pcl::PointXYZ>(ss.str(), *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);   //计算法线

        //VFH
        pcl::VFHEstimation<pcl::PointXYZ,pcl::Normal,pcl::VFHSignature308> vfh;
        vfh.setInputCloud(cloud);
        vfh.setInputNormals(cloud_normals);
        
        //创建一个空的kd树表示法
        pcl::search::KdTree<PointXYZ>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZ>);
        vfh.setSearchMethod(tree1);
        
        //输出的数据集
        pcl::PointCloud<pcl::VFHSignature308>::Ptr vfhs(new pcl::PointCloud<pcl::VFHSignature308>());
        vfh.setRadiusSearch(15);
        vfh.compute(*vfhs);
        std::stringstream ss1;
        ss1<< "Data\\model_vfh_" << i << ".pcd";
        pcl::io::savePCDFileASCII(ss1.str(), *vfhs);
    }
    cout<<"ok"<< endl;
    system("pause");
    return 0;
} 

3. Le fichier de signature VFH obtenu
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/105547035
conseillé
Classement