ch10——10.3.2PCL中的SIFT关键点提取

1.本例程将演示如何检测点云的SIFT关键点。SIFT,即尺度不变特征变换(Scale-invariant feature transform, SIFT),最初是图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子,后来被引入3D点云领域用于关键点检测。

2.代码(与源码相比有所改动)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
using namespace pcl;

namespace pcl
{
	template<>
	struct SIFTKeypointFieldSelector<PointXYZ>
	{
		inline float
			operator () (const PointXYZ &p) const
		{
			return p.z;
		}
	};
}

int main() {
	PointCloud<PointXYZ>::Ptr cloud_xyz(new PointCloud<PointXYZ>);
	io::loadPCDFile("D:\\pcd\\pig.pcd", *cloud_xyz);

	const float min_scale =0.01;//尺度空间中最小尺度的标准偏差
	const int n_octaves = 6;//高斯金字塔中组的数目
	const int n_scales_per_octave =5;//每组计算的尺度数目
	const float min_contrast = 0.001;//设置关键点检测的阈值

	SIFTKeypoint<PointXYZ, PointWithScale> sift;//创建sift检测对象
	PointCloud<PointWithScale> result;
	sift.setInputCloud(cloud_xyz);//设置输入点云
	search::KdTree<PointXYZ>::Ptr tree(new search::KdTree<PointXYZ>());
	sift.setSearchMethod(tree);//创建一个空的kd树对象tree,并把它传递给sift检测对象
	sift.setScales(min_scale, n_octaves, n_scales_per_octave);//指定搜索关键点的尺度范围
	sift.setMinimumContrast(min_contrast);//设置限制关键点检测的阈值
	sift.compute(result);执行sift关键点检测,保存结果在result
	cout<<"Sift_keypoints的大小是"<<result.size()<<endl;
	
	//类型转换
	PointCloud<PointXYZ>::Ptr cloud_temp(new PointCloud<PointXYZ>);
	copyPointCloud(result, *cloud_temp);//将点类型pcl::PointWithScale的数据转换为点类型pcl::PointXYZ的数据

	visualization::PCLVisualizer viewer("sift keypoint");
	viewer.setBackgroundColor(255, 255, 255);
	viewer.addPointCloud(cloud_xyz, "cloud");//在视窗中添加原始点云数据
	viewer.setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 0, "cloud");
	viewer.addPointCloud(cloud_temp, "keypoints");//将SIFT关键点添加至视窗
	viewer.setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 9, "keypoints");
	viewer.setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_COLOR, 0, 0,1, "keypoints");

	while (!viewer.wasStopped())
	{
		viewer.spinOnce();
	}
	return 0;
}

3.显示
ch10——10.3.2PCL中的SIFT关键点提取_第1张图片

你可能感兴趣的:(#,点云库PCL学习教程,计算机视觉)