一、AGAST角点检测
C++
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/common/common_headers.h>
#include <pcl/keypoints/agast_2d.h>
#include <pcl/keypoints/keypoint.h>
#include <pcl/point_cloud.h>
#include <pcl/filters/filter.h>using namespace pcl;
using namespace std;int main(int, char** argv)
{pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);//要配准变化的点云if (pcl::io::loadPCDFile<pcl::PointXYZRGBA>("pcd/6_00003.pcd", *cloud) == -1){PCL_ERROR("加载点云失败\n");}std::vector<int> indices; //保存去除的点的索引,一般后面用不到pcl::removeNaNFromPointCloud(*cloud, *cloud, indices); //去除点云中的NaN点///cout << "读取点云个数: " << cloud->points.size() << endl;pcl::AgastKeypoint2D<pcl::PointXYZRGBA, pcl::PointUV> Agast;pcl::PointCloud<pcl::PointXYZRGBA>::Ptr keypoints(new pcl::PointCloud<pcl::PointXYZRGBA>());PointCloud<pcl::PointUV> keypoints_1;pcl::search::KdTree<pcl::PointXYZRGBA>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGBA>());Agast.setInputCloud(cloud);Agast.setThreshold(30); //设置角检测的阈值Agast.compute(keypoints_1);cout << "AGAST_2D points 的提取结果为 " << keypoints_1.points.size() << endl;auto width = cloud->width;auto height = cloud->height;for (auto key : keypoints_1){auto u = key.u;auto v = key.v;keypoints->push_back(cloud->points[v * width + u]);}关键点显示boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("2D AGAST"));viewer1->setBackgroundColor(255, 255, 255);viewer1->setWindowName("AGAST");viewer1->addPointCloud<pcl::PointXYZRGBA>(cloud, "sample cloud");viewer1->addPointCloud<pcl::PointXYZRGBA>(keypoints, "key cloud");//特征点viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "key cloud");viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "key cloud");while (!viewer1->wasStopped()){viewer1->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100));}return 0;
}
关键代码解析:
pcl::AgastKeypoint2D<pcl::PointXYZRGBA, pcl::PointUV> Agast;pcl::PointCloud<pcl::PointXYZRGBA>::Ptr keypoints(new pcl::PointCloud<pcl::PointXYZRGBA>());PointCloud<pcl::PointUV> keypoints_1;pcl::search::KdTree<pcl::PointXYZRGBA>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGBA>());Agast.setInputCloud(cloud);Agast.setThreshold(30); //设置角检测的阈值Agast.compute(keypoints_1);
-
pcl::AgastKeypoint2D<pcl::PointXYZRGBA, pcl::PointUV> Agast;
:创建了一个AGAST角点检测器对象,用于检测2D平面上的角点。该检测器对输入的pcl::PointXYZRGBA
类型的点云进行角点检测,并将检测到的角点的2D坐标存储在pcl::PointUV
类型的点云中。 -
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr keypoints(new pcl::PointCloud<pcl::PointXYZRGBA>());
:创建了一个指向存储PointXYZRGBA类型的点云的指针,该点云用于存储检测到的角点的3D坐标信息。 -
PointCloud<pcl::PointUV> keypoints_1;
:创建了一个点云对象,用于存储2D平面上检测到的角点的UV坐标。 -
pcl::search::KdTree<pcl::PointXYZRGBA>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGBA>());
:创建了一个KD树,用于最近邻搜索。 -
Agast.setInputCloud(cloud);
:设置输入点云数据。这里假设cloud
是一个pcl::PointCloud<pcl::PointXYZRGBA>
类型的点云数据。 -
Agast.setThreshold(30);
:设置角检测的阈值。这个阈值用于决定哪些角点被检测到,较大的阈值可能会导致检测到更明显或更强烈的角点,而较小的阈值则可能会导致检测到更多的角点。 -
Agast.compute(keypoints_1);
:运行AGAST角点检测算法,将检测到的角点的2D坐标存储在keypoints_1
中。
在这个情况下,主要影响角点检测的参数是阈值setThreshold
。通过调整阈值,您可以控制检测到的角点的数量和质量。较大的阈值将导致检测到更少但可能更显著的角点,而较小的阈值将导致检测到更多但可能更弱的角点。根据实际应用场景和需求,您可以调整阈值来达到所需的效果。