点云库PCL学习:基于VFH描述子的聚类识别(1_提取模型vfh特征)

最近在进行物体识别,现将调试的过程分享给大家。我的任务与教材还是有些差别。主要在于:

  1. 只需要识别出是物体的类别即可,并不需要估计位姿
  2. 我的点云数据是PointXYZ

本文我将介绍根据模型的点云提取vfh特征

1.首先将模型文件命名为“model_*.pcd”的格式,并放入Data文件夹

在这里插入图片描述
2.估计vfh特征,并保存文.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.得到的vfh特征文件
在这里插入图片描述

发布了22 篇原创文章 · 获赞 2 · 访问量 1157

猜你喜欢

转载自blog.csdn.net/qinqinxiansheng/article/details/105547035