執行效率慢,佔用大量CPU,最終計算PFH的點雲大小和輸入的點雲大小相同,即fpfhs->points.size() s= cloud->points.size()php
http://www.pointclouds.org/documentation/tutorials/fpfh_estimation.php#fpfh-estimation多線程
#include <pcl/features/fpfh_omp.h> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // Create the FPFH estimation class, and pass the input dataset+normals to it pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> fpfh; //使用OMP多線程加速執行,待驗證 //pcl::FPFHEstimationOMP<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> fpfh; //fpfh.setNumberOfThreads(8); fpfh.setInputCloud(cloud); fpfh.setInputNormals(normals); // alternatively, if cloud is of tpe PointNormal, do fpfh.setInputNormals (cloud); // Create an empty kdtree representation, and pass it to the FPFH estimation object. // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given). pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); fpfh.setSearchMethod(tree); // Output datasets pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfhs(new pcl::PointCloud<pcl::FPFHSignature33>()); // Use all neighbors in a sphere of radius 5cm // IMPORTANT: the radius used here has to be larger than the radius used to estimate the surface normals!!! fpfh.setRadiusSearch(0.05); // Compute the features fpfh.compute(*fpfhs);
在計算FPFH時,考慮到效率的問題,沒有對法向量進行空和無窮大檢測,所以在計算FPH前須要進行法向量的判斷,使用以下代碼:ide
for (int i = 0; i < normals->points.size(); i++) { if (!pcl::isFinite<pcl::Normal>(normals->points[i])) { PCL_WARN("normals[%d] is not finite\n", i); } }