版权声明:坚持原创,禁止转载。 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);
}
这个主要是我们可视化的时候需要它不停的刷新,这样才可以显示,没有这个可视化界面会出不来。。。
该大家看下结果把,还是很有意思的