点云特征提取--vfh

      开始做点云识别了,在matlab 上自己写了一个点云特征提取脚本,跑出来的效果还不错,于是想跟pcl官网的点云特征提取算法比较一下,看看两者在识别上谁会好一点。

     vfh代码我参考某位博主的,忘记是谁了阿。

     我封装成了一个函数,输入点云,返回308维的点云特征。

#include 
#include //法线特征

pcl::PointCloud GetVFHFeature(pcl::PointCloud::Ptr cloud_ptr)
{
	pcl::NormalEstimation ne;
	ne.setInputCloud(cloud_ptr);
	pcl::search::KdTree::Ptr tree(new pcl::search::KdTree());
	ne.setSearchMethod(tree);//设置近邻搜索算法 
	pcl::PointCloud::Ptr cloud_normals_ptr(new pcl::PointCloud);
	pcl::PointCloud& cloud_normals = *cloud_normals_ptr;
	ne.setKSearch(40);  // 临近值50
	// 计算表面法线特征
	ne.compute(cloud_normals);

	pcl::VFHEstimation vfh;
	vfh.setInputCloud(cloud_ptr);
	vfh.setInputNormals(cloud_normals_ptr);
	pcl::search::KdTree::Ptr tree2(new pcl::search::KdTree());
	vfh.setSearchMethod(tree2);//设置近邻搜索算法 
	pcl::PointCloud::Ptr vfh_fe_ptr(new pcl::PointCloud());//vhf特征
	vfh.compute(*vfh_fe_ptr);

	return *vfh_fe_ptr;
}

     然后主函数调用就行了。

pcl::PointCloud::Ptr vfh_fe_ptr(new pcl::PointCloud());
	*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特征画出来。

点云特征提取--vfh_第1张图片

      0很多,可以适当降一下维,我忘记了。其实我感觉整体的特征区别貌似不是很大。。反正测试结果正确率是80多。。

      不过跟法向量的估值有很大关系,适当调一下法向量那一步的参数效果可能会好一点。

                显示的代码的话,参考fpfh的代码吧,类似的,改一下就好了

	#include  // plotter



  int main()
{
	pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
	pcl::io::loadPCDFile("D:\\VS_Files\\Lidar\\Project2\\cloud_point\\train_sample\\RGB_dataset_pcd\\banana_train\\banana_1.pcd", *cloud);
	pcl::PointCloud::Ptr fphf_ (new pcl::PointCloud());;
	*fphf_ = Get_FPFH_Feature(cloud);
	pcl::visualization::PCLPlotter *plotter = new pcl::visualization::PCLPlotter("My Plotter");
	//设置特性
	plotter->setShowLegend(true);
	std::cout << pcl::getFieldsList(*fphf_);

	//显示
	plotter->addFeatureHistogram(*fphf_, "fpfh", 0);
	plotter->spin();
	plotter->clearPlots();
	system("pause");
	return 0;
}

 

你可能感兴趣的:(模式识别&图像处理)