Aprendizaje PCL de la biblioteca de nube de puntos: reconocimiento de clúster basado en el descriptor VFH (función 1_extract model vfh)

Recientemente realicé el reconocimiento de objetos y compartiré contigo el proceso de depuración. Todavía hay algunas diferencias entre mi tarea y los materiales de enseñanza. Principalmente radica en:

  1. Solo necesita identificar la categoría del objeto, no necesita estimar la pose
  2. Mis datos de la nube de puntos son PointXYZ

En este artículo, presentaré la extracción de características vfh de acuerdo con la nube de puntos del modelo

1. Nombre el archivo del modelo en el formato "modelo _ *. Pcd" y póngalo en la carpeta Datos

Inserte la descripción de la imagen aquí
2. Estime las características de vfh y guarde el archivo de texto .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. El archivo de firma VFH obtenido
Inserte la descripción de la imagen aquí

22 artículos originales publicados · Me gusta2 · Visitas 1157

Supongo que te gusta

Origin blog.csdn.net/qinqinxiansheng/article/details/105547035
Recomendado
Clasificación