PCL ISS特征点提取

pcl关键点提取,有iss,sift等多种方法,关键点又可以称为兴趣点,关键点要比原始点云文件要少很多点,对于一些原始点云点数特别多的文件,我们不需要过多的点,这样不仅会加大计算机负担,而且对点云的处理也没有好处。通过提取关键点,可以进行物体识别、追踪等相关处理。

ISS特征点提取代码如下:

#include <iostream>

#include <pcl/io/pcd_io.h>//pcd读写类头文件

#include <pcl/point_types.h>//支持点类型头文件

#include <pcl/common/io.h>//common模块库

#include <pcl/keypoints/iss_3d.h>//iss特征点

#include <pcl/features/normal_3d.h>

#include <pcl/visualization/pcl_visualizer.h>//pcl可视化

#include <boost/thread/thread.hpp>//一个类就是boost::thread,它是在boost/thread.hpp里定义的,用来创建一个新线程

#include <pcl/visualization/cloud_viewer.h>//点云可视化



using namespace std;



int main(int, char** argv)

{

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

    if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\pclcode\\pcl_border\\range_image_border_extraction\\source\\bunny.pcd", *cloud) == -1)

    {

         PCL_ERROR("Could not read pcd file\n");

    }

    cout << "原始点云文件点云个数: " << cloud->points.size() << endl;//输出点云总个数

    pcl::ISSKeypoint3D<pcl::PointXYZ, pcl::PointXYZ> iss;//创建iss

    pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints(new pcl::PointCloud<pcl::PointXYZ>());//创建keypoints指针

    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());//创建tree指针



    iss.setInputCloud(cloud);//设置输入点云

    iss.setSearchMethod(tree);//设置搜索方法

    iss.setSalientRadius(0.007f);//设置用于计算协方差矩阵的球邻域半径

    iss.setNonMaxRadius(0.005f);//设置非极大值抑制应用算法的半径

    iss.setThreshold21(0.65); //设定第二个和第一个特征值之比的上限

    iss.setThreshold32(0.5);  //设定第三个和第二个特征值之比的上限

    iss.setMinNeighbors(10); //在应用非极大值抑制算法时,设置必须找到的最小邻居数

    iss.setNumberOfThreads(4); //初始化调度器并设置要使用的线程数

    iss.compute(*keypoints);//计算关键点个数



    cout << "ISS_3D points 的提取结果为 " << keypoints->points.size() << endl;//在屏幕上输出关键点的个数

    pcl::io::savePCDFile("keypoints_iss_3d.pcd", *keypoints, true);//保存结果

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ISS关键点提取"));//创建共享指针viewer

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 225, 0);//设置可视化点云点的颜色

    viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");//点云文件的点

    viewer->addPointCloud<pcl::PointXYZ>(keypoints, "sample cloud1");//特征点

viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "sample cloud1");//关键点的点大小

    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 255, 0.0, 0.0, "sample cloud1");//关键点的颜色设置

    while (!viewer->wasStopped())

    {

         viewer->spinOnce(100);//刷新

         boost::this_thread::sleep(boost::posix_time::microseconds(100));

    }

    return 0;



}

CmakeLists文件如下:

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)

project(range_image_border_extraction)

find_package(PCL 1.3 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})

link_directories(${PCL_LIBRARY_DIRS})

add_definitions(${PCL_DEFINITIONS})

add_executable (range_image_border_extraction range_image_border_extraction.cpp)

target_link_libraries (range_image_border_extraction ${PCL_LIBRARIES})

执行效果如下图所示:

#include <iostream>

#include <pcl/io/pcd_io.h>//pcd读写类头文件

#include <pcl/point_types.h>//支持点类型头文件

#include <pcl/common/io.h>//common模块库

#include <pcl/keypoints/iss_3d.h>//iss特征点

#include <pcl/features/normal_3d.h>

#include <pcl/visualization/pcl_visualizer.h>//pcl可视化

#include <boost/thread/thread.hpp>//一个类就是boost::thread,它是在boost/thread.hpp里定义的,用来创建一个新线程

#include <pcl/visualization/cloud_viewer.h>//点云可视化



using namespace std;



int main(int, char** argv)

{

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

    if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\pclcode\\pcl_border\\range_image_border_extraction\\source\\table_scene_lms400.pcd", *cloud) == -1)

    {

         PCL_ERROR("Could not read pcd file\n");

    }

    cout << "原始点云文件点云个数: " << cloud->points.size() << endl;//输出点云总个数

    pcl::ISSKeypoint3D<pcl::PointXYZ, pcl::PointXYZ> iss;//创建iss

    pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints(new pcl::PointCloud<pcl::PointXYZ>());//创建keypoints指针

    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());//创建tree指针



    iss.setInputCloud(cloud);//设置输入点云

    iss.setSearchMethod(tree);//设置搜索方法

    iss.setSalientRadius(0.004f);//设置用于计算协方差矩阵的球邻域半径

    iss.setNonMaxRadius(0.005f);//设置非极大值抑制应用算法的半径

    iss.setThreshold21(0.65); //设定第二个和第一个特征值之比的上限

    iss.setThreshold32(0.5);  //设定第三个和第二个特征值之比的上限

    iss.setMinNeighbors(10); //在应用非极大值抑制算法时,设置必须找到的最小邻居数

    iss.setNumberOfThreads(4); //初始化调度器并设置要使用的线程数

    iss.compute(*keypoints);//计算关键点个数



    cout << "ISS_3D points 的提取结果为 " << keypoints->points.size() << endl;//在屏幕上输出关键点的个数

    pcl::io::savePCDFile("keypoints_iss_3d.pcd", *keypoints, true);//保存结果

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ISS关键点提取"));//创建共享指针viewer

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 225, 0);//设置可视化点云点的颜色

    viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");//点云文件的点

    viewer->addPointCloud<pcl::PointXYZ>(keypoints, "sample cloud1");//特征点

viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "sample cloud1");//关键点的点大小

    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 255, 255, 255, "sample cloud1");//关键点的颜色设置

    while (!viewer->wasStopped())

    {

         viewer->spinOnce(100);//刷新

         boost::this_thread::sleep(boost::posix_time::microseconds(100));

    }

    return 0;



}

//原始点云文件点云个数: 460400

//ISS_3D points 的提取结果为 10717

具体的参数需要自己去调整:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙有肥鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值