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
具体的参数需要自己去调整: