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:
- Solo necesita identificar la categoría del objeto, no necesita estimar la pose
- 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
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