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:
- Il suffit d'identifier la catégorie de l'objet, n'a pas besoin d'estimer la pose
- 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
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