PCL二值化描述子匹配代码
时间: 2023-11-13 18:11:06 浏览: 60
自己编了个二值图和灰度图的匹配代码还不错-1.fig
下面是一个使用PCL库中的SIFT二值化描述子进行点云匹配的示例代码:
```c++
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/fpfh.h>
#include <pcl/features/pfh.h>
#include <pcl/features/shot.h>
#include <pcl/features/3dsc.h>
#include <pcl/features/usc.h>
#include <pcl/features/sift.h>
#include <pcl/registration/icp.h>
#include <pcl/registration/ia_ransac.h>
#include <pcl/visualization/pcl_visualizer.h>
int main(int argc, char** argv)
{
// Load point clouds
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ>("cloud1.pcd", *cloud1);
pcl::io::loadPCDFile<pcl::PointXYZ>("cloud2.pcd", *cloud2);
// Compute SIFT keypoints and descriptors for each cloud
pcl::SIFTKeypoint<pcl::PointXYZ, pcl::PointWithScale> sift;
pcl::PointCloud<pcl::PointWithScale>::Ptr keypoints1(new pcl::PointCloud<pcl::PointWithScale>);
pcl::PointCloud<pcl::PointWithScale>::Ptr keypoints2(new pcl::PointCloud<pcl::PointWithScale>);
pcl::SIFTDescriptor<pcl::PointXYZ, pcl::PointWithScale>::Ptr descriptor1(new pcl::SIFTDescriptor<pcl::PointXYZ, pcl::PointWithScale>);
pcl::SIFTDescriptor<pcl::PointXYZ, pcl::PointWithScale>::Ptr descriptor2(new pcl::SIFTDescriptor<pcl::PointXYZ, pcl::PointWithScale>);
sift.setInputCloud(cloud1);
sift.compute(*keypoints1, *descriptor1);
sift.setInputCloud(cloud2);
sift.compute(*keypoints2, *descriptor2);
// Match SIFT descriptors
pcl::CorrespondencesPtr correspondences(new pcl::Correspondences());
pcl::registration::CorrespondenceEstimation<pcl::SIFTDescriptor<pcl::PointXYZ, pcl::PointWithScale>, pcl::SIFTDescriptor<pcl::PointXYZ, pcl::PointWithScale> > est;
est.setInputSource(descriptor1);
est.setInputTarget(descriptor2);
est.determineCorrespondences(*correspondences);
// Reject correspondences based on distance
pcl::CorrespondencesPtr inliers(new pcl::Correspondences());
pcl::registration::CorrespondenceRejectorDistance rej;
rej.setInputCorrespondences(correspondences);
rej.setMaximumDistance(0.1); // set maximum distance threshold
rej.getCorrespondences(*inliers);
// Visualize correspondences
pcl::visualization::PCLVisualizer viewer("Correspondences");
viewer.addPointCloud(cloud1, "cloud1");
viewer.addPointCloud(cloud2, "cloud2");
for (int i = 0; i < inliers->size(); i++)
{
int idx1 = inliers->at(i).index_query;
int idx2 = inliers->at(i).index_match;
viewer.addLine<pcl::PointXYZ>(cloud1->points[idx1], cloud2->points[idx2], 1, 0, 0, "line" + std::to_string(i));
}
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
return 0;
}
```
上述代码中,首先加载了两个点云文件`cloud1.pcd`和`cloud2.pcd`。然后使用`pcl::SIFTKeypoint`计算两个点云的SIFT特征点,再使用`pcl::SIFTDescriptor`计算每个特征点的SIFT描述子。接着使用`pcl::registration::CorrespondenceEstimation`计算两个点云之间的SIFT描述子匹配,得到初始的对应关系。最后使用`pcl::registration::CorrespondenceRejectorDistance`根据距离阈值筛选出高质量的匹配点对,并使用`pcl::visualization::PCLVisualizer`可视化展示匹配结果。
阅读全文