自学内容网 自学内容网

PCL点云处理之关键点提取

点云中有很多“充数”的点,提取关键特征可以减小数据处理量,同时又保留关键特征。

#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" // 用于计算模型分辨率
#include <boost/thread/thread.hpp>

typedef pcl::PointXYZ PointT;

int main(int argc, char** argv)
{
// 读取点云
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
    
pcl::io::loadPCDFile("../new.pcd", *cloud);
std::cout << "original cloud size : " << cloud->size() << std::endl;
    //画底图
    pcl::visualization::PCLVisualizer viewer; 
viewer.setBackgroundColor(100, 100, 100); // rgb
pcl::visualization::PointCloudColorHandlerCustom<PointT> red1(cloud, 0, 0, 0); // rgb
viewer.addPointCloud(cloud, red1, "cloud");

double resolution = computeCloudResolution(cloud);

pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());

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);
std::cout << "key points size : " << keys->size() << std::endl;
    //看一下关键点
pcl::visualization::PointCloudColorHandlerCustom<PointT> red(keys, 255, 0, 0); // rgb

viewer.addPointCloud(keys, red, "keys");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,5,"keys");//把key对应的点大小设置大一点

viewer.spin();

// 2. 非阻塞式
while (!viewer.wasStopped())
{
viewer.spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
// 可添加其他操作
}
system("pause");
return 0;
}


原文地址:https://blog.csdn.net/qq_35210952/article/details/142881943

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!