提取关键点
- 计算分辨率‘
#include <pcl/io/pcd_io.h>
#include <pcl/search/kdtree.h>
// This function by Tommaso Cavallari and Federico Tombari, taken from the tutorial
// http://pointclouds.org/documentation/tutorials/correspondence_grouping.php
double computeCloudResolution(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& cloud)
{
double resolution = 0.0;
int numberOfPoints = 0;
int nres;
std::vector<int> indices(2);
std::vector<float> squaredDistances(2);
pcl::search::KdTree<pcl::PointXYZ> tree;
tree.setInputCloud(cloud);
for (size_t i = 0; i < cloud->size(); ++i)
{
if (!std::isfinite((*cloud)[i].x))
continue;
// Considering the second neighbor since the first is the point itself.
nres = tree.nearestKSearch(i, 2, indices, squaredDistances);
if (nres == 2)
{
resolution += sqrt(squaredDistances[1]);
++numberOfPoints;
}
}
if (numberOfPoints != 0)
resolution /= numberOfPoints;
return resolution;
}
#pragma once
- 计算关键点并且显示
#include<pcl/io/pcd_io.h>
#include <pcl/point_types.h>
// 包含相关头文件
#include<pcl/keypoints/iss_3d.h>
#include<pcl/visualization/pcl_visualizer.h>
#include "resolution.h"// 计算模型的分辨率
using namespace std;
typedef pcl::PointXYZ PointT;
int main() {
// 读取点云
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
pcl::io::loadPCDFile("rabbit.pcd", *cloud);
std::cout << "original cloud size : " << cloud->size() << std::endl;
double resolution = computeCloudResolution(cloud);// 计算模型分辨率
cout << "模型分辨率为" << resolution << endl;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
pcl::ISSKeypoint3D<PointT, PointT> iss_dector;
pcl::ISSKeypoint3D<PointT, PointT> iss_detector;
iss_detector.setSearchMethod(tree);
iss_detector.setSalientRadius(6 * resolution);
iss_detector.setNonMaxRadius(4 * resolution);
iss_detector.setThreshold21(0.975);
iss_detector.setThreshold32(0.975);
iss_detector.setMinNeighbors(5);
iss_detector.setNumberOfThreads(4);
iss_detector.setInputCloud(cloud);
pcl::PointCloud<PointT>::Ptr keys(new pcl::PointCloud<PointT>);
iss_detector.compute(*keys);
pcl::io::savePCDFile("keypoints.pcd", *keys, true);
std::cout << "key points size : " << keys->size() << std::endl;
//显示
pcl::visualization::PCLVisualizer viewer;
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> fildColor(cloud, 255, 222, 173);//设置点云颜色
viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "orginal cloud");
viewer.addPointCloud<pcl::PointXYZ>(keys, "keyPoints");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "keyPoints");//设置点的大小
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 255, 0, 0, "keyPoints");.//设置点的颜色
viewer.spin();
system("pause");
return 0;
}
参考链接:https://github.com/MNewBie/PCL-Notes/blob/master/chapter2.md