3维Harris角点提取pcl实现

版权声明:坚持原创,禁止转载。 https://blog.csdn.net/SLAM_masterFei/article/details/85326838

Harris响应一般是用在二维图像上的,用来寻找图像上的角点,算法见上一节描述,如何将二维扩展到三维呢,博主看的还不是很清楚,但是大致是这样的,对于空间上的某一个点,进行一个半径r的搜索,对于区域内的点进行pca重新确定它的主方向,我个人理解是相当于确定新的x和y方向,这样就可以类比到平面了,虽然会丢失一个维度,但是没有关系啊,对于最后一个维度,我们认为是该点拟合的x,y平面的法线方向,这也是十分平凡的,因为三个向量互相垂直。

重点来了,对于我们得到的法线,我们认为它就是强度值,这样,我们成功将三维点转换到了二维平面上。那么很好的是,pcl集成了harris响应,我们下面一起来看看把

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/keypoints/harris_3d.h>
#include <boost/thread/thread.hpp>
#include <stdlib.h>
#include <iostream>

using namespace std;
using namespace std;
int main(int argc, char** argv)
{

	// 创建点云对象指针
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

	pcl::io::loadPCDFile<pcl::PointXYZ>("1.pcd", *cloud);
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud1");
	
	//harris detect

	pcl::HarrisKeypoint3D<pcl::PointXYZ, pcl::PointXYZI, pcl::Normal> harris;
	harris.setInputCloud(cloud);//设置输入点云 指针
	harris.setNonMaxSupression(true);
	harris.setRadius(0.6f);// 块体半径
	harris.setThreshold(0.01f);//数量阈值
	//新建的点云必须初始化,清零,否则指针会越界
	//注意Harris的输出点云必须是有强度(I)信息的 pcl::PointXYZI,因为评估值保存在I分量里
	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_out_ptr(new pcl::PointCloud<pcl::PointXYZI>);

	// 计算特征点
	harris.compute(*cloud_out_ptr);
	// 关键点
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_harris_ptr(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointXYZ point;
	//可视化结果不支持XYZI格式点云,所有又要导回XYZ格式。。。。
	for (int i = 0; i<size; ++i)
	{
		point.x = cloud_out_ptr->at(i).x;
		point.y = cloud_out_ptr->at(i).y;
		point.z = cloud_out_ptr->at(i).z;
		cloud_harris_ptr->push_back(point);
	}
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> harris_color_handler(cloud_harris_ptr, 0, 255, 0);//第一个参数类型为 指针
	viewer->addPointCloud<pcl::PointXYZ>(cloud_harris_ptr, harris_color_handler, "harris");//第一个参数类型为 指针
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "harris");

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);

	}
	system("pause");
	return 0;
}

它的参数设置主要在设定搜索半径和阈值上面,不得不承认,不看论文真的很难调这两个参数,所以建议大家还是以后尽量多看论文比较好。

还有一个需要注意的是

while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);

    }

这个主要是我们可视化的时候需要它不停的刷新,这样才可以显示,没有这个可视化界面会出不来。。。

该大家看下结果把,还是很有意思的

猜你喜欢

转载自blog.csdn.net/SLAM_masterFei/article/details/85326838