点云库PCL学习:关键点提取(SIFT、Harris)

SIFT关键点提取:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/time.h>
#include <pcl/keypoints/sift_keypoint.h>//sift
using namespace pcl;

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

int main(int argc, char **argv)
{
    //读取点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr loud(new pcl::PointCloud<pcl::PointXYZ>); 
    if pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud) = -1)
    {
        PCL_ERROR("Cloudn't ead file!");
        system("pause");
        return 1;
    }
    //sift关键点提取
    const loat min_scale = 0.01;    //设置尺度空间中最小尺度的标准偏差
    const nt n_octaves = 6;         //设置高斯金字塔组(octave)的数目
    const nt n_scales_per_octave =4;//设置每组(octave)计算的尺度
    const loat min_contrast = 0.01; //设置限制关键点检测的阈值 

    pcl::SIFTKeypoint<pcl::PointXYZ, cl::PointWithScale> sift;//创建sift关键点检测对象
    pcl::PointCloud<pcl::PointWithScale> esult;
    sift.setInputCloud(cloud);//设置输入点云
    pcl::search::KdTree<pcl::PointXYZ>::Ptr ree(new pcl::search::KdTree<pcl::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;

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_temp(new pcl::PointCloud<pcl::PointXYZ>);
    copyPointCloud(result, *cloud_temp);//将点类型pcl::PointWithScale的数据转换为点类型pcl::PointXYZ的数据

    //可视化输入点云和关键点
    pcl::visualization::PCLVisualizer viewer("Sift keypoint");
    viewer.setBackgroundColor(255, 255, 255);
    viewer.addPointCloud(cloud, "cloud");        
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2, "cloud");    
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0, 0, 0, "cloud");
    viewer.addPointCloud(cloud_temp, "keypoints");       
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,8, "keypoints");
   viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0.0, 0.0, 255.0, "keypoints");
    while (!viewer.wasStopped())
    {       
        viewer.spinOnce();
    }
    return 0;
}

在这里插入图片描述

Harris关键点提取:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/time.h>
#include <pcl/keypoints/harris_3D.h>//harris
using namespace pcl;

int main(int argc, char **argv)
{
    //读取点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    if (pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud) == -1)
    {
        PCL_ERROR("Cloudn't read file!");
        system("pause");
        return -1;
    }

    //Harris关键点提取
    float r_normal;
    float r_keypoint;
    r_normal = 0.6;
    r_keypoint = 0.8;
    typedef pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZI> ColorHandlerT3;

 

    pcl::PointCloud<pcl::PointXYZI>::Ptr Harris_keypoints(new pcl::PointCloud<pcl::PointXYZI>());    pcl::HarrisKeypoint3D<pcl::PointXYZ,pcl::PointXYZI,pcl::Normal>* harris_detector = new pcl::HarrisKeypoint3D<pcl::PointXYZ, pcl::PointXYZI, pcl::Normal>;
    harris_detector->setRadius(r_normal);         //设置法向量估算的半径
    harris_detector->setRadiusSearch(r_keypoint);
//设置关键点估计的近邻搜索半径
    harris_detector->setInputCloud(cloud);
    harris_detector->compute(*Harris_keypoints);
    cout<< "Harris_keypoints的大小是" <<Harris_keypoints->size()<< endl;
    //显示harris关键点
    pcl::visualization::PCLVisualizer viewer("clouds");
    viewer.setBackgroundColor(255,255, 255);    viewer.addPointCloud(Harris_keypoints,ColorHandlerT3(Harris_keypoints,0.0, 0.0, 255.0),
"Harris_keypoints");    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,8, "Harris_keypoints");

    viewer.addPointCloud(cloud,"cloud"); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0,0, 0, "cloud");  
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,
2, "cloud");
    viewer.setCameraPosition(0,0, 0, 0, 156, -20, 0, 0, 1, 0);//设置相机位置,焦点,方向
    viewer.spin();
    return 0;
}

在这里插入图片描述

参考:
https://www.cnblogs.com/freshmen/p/4254573.html

https://blog.csdn.net/SLAM_masterFei/article/details/85326838

发布了22 篇原创文章 · 获赞 2 · 访问量 1157

猜你喜欢

转载自blog.csdn.net/qinqinxiansheng/article/details/105498561