特征总览
![在这里插入图片描述](https://img-blog.csdnimg.cn/31115732baee406683dd3f92ffb92b0e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbW95dWVyMQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
代码
#include <pcl/io/pcd_io.h>
#include <pcl/features/pfh.h>
#include <pcl/visualization/pcl_plotter.h>
#include <pcl/features/normal_3d_omp.h>
pcl::PointCloud<pcl::Normal>::Ptr pcl_feature_normals_k(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in, float K)
{
pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud_in);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
ne.setKSearch(K);
ne.compute(*normals);
return normals;
}
pcl::PointCloud<pcl::PFHSignature125>::Ptr pcl_feature_pfh(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in, float radius_normal, float k_pfh)
{
auto cloud_normals = pcl_feature_normals_k(cloud_in, radius_normal);
pcl::PFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::PFHSignature125> pfh;
pfh.setInputCloud(cloud_in);
pfh.setInputNormals(cloud_normals);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree_pfh(new pcl::search::KdTree<pcl::PointXYZ>);
pfh.setSearchMethod(tree_pfh);
pcl::PointCloud<pcl::PFHSignature125>::Ptr pfhs(new pcl::PointCloud<pcl::PFHSignature125>());
pfh.setKSearch(k_pfh);
pfh.compute(*pfhs);
return pfhs;
}
int main(int argc,char**argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile(argv[1],*cloud);
auto pfhs = pcl_feature_pfh(cloud,10,20);
pcl::visualization::PCLPlotter plotter;
plotter.setWindowName("PFH");
plotter.setWindowSize(800, 600);
plotter.addFeatureHistogram(*pfhs, 125);
plotter.plot();
return 0;
}
结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/fab1b84fb28f47fab1a6f4d57f87b9bb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbW95dWVyMQ==,size_20,color_FFFFFF,t_70,g_se,x_16)