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

  最近在做基于点云的物体识别,现将调试的过程分享给大家,所有程序均在vs2015+pcl1.81运行通过。

内容介绍:

我的内容与教材还是有些差别。主要在于:
1.只需要识别出是物体的类别即可,并不需要估计位姿
2. 我的点云数据是PointXYZ

整个过程包括三个阶段,我将分三次博文进行介绍:
1.准备阶段:从不同视角采集物体的点云数据,并计算VFH描述子
2.训练阶段:基于所计算的多组VFH描述子建立kd-tree
3.测试阶段:计算带识别物体点云的VFH描述子,利用VFH描述子在上面建立的kd-tree进行搜索,查找候选集

第一阶段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描述子文件
在这里插入图片描述

附完整程序连接:
https://download.csdn.net/download/qinqinxiansheng/12339862

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值