PCL中布尔型描述子的特征匹配方法
时间: 2023-10-05 11:12:42 浏览: 95
提取特征点并进行匹配
5星 · 资源好评率100%
PCL 中常用的布尔型描述子是 Point Feature Histograms (PFH) 描述子。在 PCL 中,可以使用 `pcl::PFHEstimation` 类来计算 PFH 描述子,使用 `pcl::registration::CorrespondenceEstimation` 类来计算两个点云数据集之间的对应关系。
首先,使用 `pcl::PFHEstimation` 类来计算两个点云数据集的 PFH 描述子。例如:
```cpp
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_target(new pcl::PointCloud<pcl::PointXYZ>());
// 读取点云数据集到 cloud_source 和 cloud_target 中
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree_source(new pcl::search::KdTree<pcl::PointXYZ>());
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree_target(new pcl::search::KdTree<pcl::PointXYZ>());
// 建立 KdTree 数据结构,用于最近邻搜索
pcl::PointCloud<pcl::Normal>::Ptr normals_source(new pcl::PointCloud<pcl::Normal>());
pcl::PointCloud<pcl::Normal>::Ptr normals_target(new pcl::PointCloud<pcl::Normal>());
// 计算法线
pcl::PFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::PFHSignature125> pfh_estimation;
pfh_estimation.setSearchMethodSource(tree_source);
pfh_estimation.setSearchMethodTarget(tree_target);
pfh_estimation.setInputCloudSource(cloud_source);
pfh_estimation.setInputCloudTarget(cloud_target);
pfh_estimation.setInputNormalsSource(normals_source);
pfh_estimation.setInputNormalsTarget(normals_target);
pcl::PointCloud<pcl::PFHSignature125>::Ptr pfhs_source(new pcl::PointCloud<pcl::PFHSignature125>());
pcl::PointCloud<pcl::PFHSignature125>::Ptr pfhs_target(new pcl::PointCloud<pcl::PFHSignature125>());
// 创建存储 PFH 描述子的点云数据集
pfh_estimation.compute(*pfhs_source);
pfh_estimation.compute(*pfhs_target);
// 计算 PFH 描述子
```
接着,使用 `pcl::registration::CorrespondenceEstimation` 类来计算两个点云数据集之间的对应关系。例如:
```cpp
pcl::registration::CorrespondenceEstimation<pcl::PFHSignature125, pcl::PFHSignature125> est;
est.setInputSource(pfhs_source);
est.setInputTarget(pfhs_target);
pcl::CorrespondencesPtr correspondences(new pcl::Correspondences());
est.determineCorrespondences(*correspondences);
// 计算对应关系
```
最后,使用 `pcl::registration::CorrespondenceRejectorSampleConsensus` 类来去除错误的对应关系,并进行配准。例如:
```cpp
pcl::registration::CorrespondenceRejectorSampleConsensus<pcl::PointXYZ> rejector;
rejector.setInputSource(cloud_source);
rejector.setInputTarget(cloud_target);
rejector.setInlierThreshold(0.1);
rejector.setMaximumIterations(10000);
pcl::CorrespondencesPtr correspondences_filtered(new pcl::Correspondences());
rejector.getRemainingCorrespondences(*correspondences, *correspondences_filtered);
// 去除错误的对应关系
pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ> transformation_estimation;
Eigen::Matrix4f transformation_matrix;
transformation_estimation.estimateRigidTransformation(*cloud_source, *cloud_target, *correspondences_filtered, transformation_matrix);
// 计算变换矩阵
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source_transformed(new pcl::PointCloud<pcl::PointXYZ>());
pcl::transformPointCloud(*cloud_source, *cloud_source_transformed, transformation_matrix);
// 对源点云进行变换
pcl::visualization::CloudViewer viewer("Viewer");
viewer.showCloud(cloud_source_transformed);
while(!viewer.wasStopped());
// 可视化
```
需要注意的是,布尔型描述子之间的匹配过程与浮点型描述子之间的匹配过程有所不同。在匹配过程中,除了计算描述子之间的距离外,还需要考虑到描述子的方向性。因此,在匹配过程中需要使用到法线信息。在上述代码中,计算 PFH 描述子时计算了法线信息,用于后续的匹配过程中。
阅读全文