开始做点云识别了,在matlab 上自己写了一个点云特征提取脚本,跑出来的效果还不错,于是想跟pcl官网的点云特征提取算法比较一下,看看两者在识别上谁会好一点。
vfh代码我参考某位博主的,忘记是谁了阿。
我封装成了一个函数,输入点云,返回308维的点云特征。
#include <pcl/features/vfh.h>
#include <pcl/features/normal_3d.h>//法线特征
pcl::PointCloud<pcl::VFHSignature308> GetVFHFeature(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr)
{
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud_ptr);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);//设置近邻搜索算法
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals_ptr(new pcl::PointCloud<pcl::Normal>);
pcl::PointCloud<pcl::Normal>& cloud_normals = *cloud_normals_ptr;
ne.setKSearch(40); // 临近值50
// 计算表面法线特征
ne.compute(cloud_normals);
pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> vfh;
vfh.setInputCloud(cloud_ptr);
vfh.setInputNormals(cloud_normals_ptr);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree2(new pcl::search::KdTree<pcl::PointXYZ>());
vfh.setSearchMethod(tree2);//设置近邻搜索算法
pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_fe_ptr(new pcl::PointCloud<pcl::VFHSignature308>());//vhf特征
vfh.compute(*vfh_fe_ptr);
return *vfh_fe_ptr;
}
然后主函数调用就行了。
pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_fe_ptr(new pcl::PointCloud<pcl::VFHSignature308>());
*vfh_fe_ptr = GetVFHFeature(cloud_ptr);
tttt是返回的特征长度,后面的for循环将每一个bin的值(每一维的特征值)输出来。
int tttt = vfh_fe_ptr->points[0].descriptorSize();
cout << tttt << endl;
for (size_t temi = 0; temi < tttt; ++temi)
cout << vfh_fe_ptr->points[0].histogram[temi] <<" "<< endl;
我将点云在pcl+vs中将特征提取出来,然后在matlab中训练测试其识别率。下面是随便选的几类样本的vfh特征画出来。
0很多,可以适当降一下维,我忘记了。其实我感觉整体的特征区别貌似不是很大。。反正测试结果正确率是80多。。
不过跟法向量的估值有很大关系,适当调一下法向量那一步的参数效果可能会好一点。
显示的代码的话,参考fpfh的代码吧,类似的,改一下就好了
#include<pcl/visualization/pcl_plotter.h> // plotter
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:\\VS_Files\\Lidar\\Project2\\cloud_point\\train_sample\\RGB_dataset_pcd\\banana_train\\banana_1.pcd", *cloud);
pcl::PointCloud<pcl::FPFHSignature33>::Ptr fphf_ (new pcl::PointCloud<pcl::FPFHSignature33>());;
*fphf_ = Get_FPFH_Feature(cloud);
pcl::visualization::PCLPlotter *plotter = new pcl::visualization::PCLPlotter("My Plotter");
//设置特性
plotter->setShowLegend(true);
std::cout << pcl::getFieldsList<pcl::FPFHSignature33>(*fphf_);
//显示
plotter->addFeatureHistogram<pcl::FPFHSignature33>(*fphf_, "fpfh", 0);
plotter->spin();
plotter->clearPlots();
system("pause");
return 0;
}