PCL如何利用二值化描述子快速计算点云相似度代码
时间: 2023-09-07 10:11:30 浏览: 182
这里给出一个使用`pcl::SHOTEstimationOMP`计算点云相似度的示例代码:
```cpp
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
// 读取点云数据到cloud1和cloud2中
// 计算cloud1和cloud2的SHOT描述子
pcl::SHOTEstimationOMP<pcl::PointXYZ, pcl::Normal, pcl::SHOT352> shot;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
shot.setSearchMethod(tree);
shot.setRadiusSearch(0.02);
pcl::PointCloud<pcl::SHOT352>::Ptr descriptors1(new pcl::PointCloud<pcl::SHOT352>());
pcl::PointCloud<pcl::SHOT352>::Ptr descriptors2(new pcl::PointCloud<pcl::SHOT352>());
shot.setInputCloud(cloud1);
shot.setInputNormals(normals1);
shot.compute(*descriptors1);
shot.setInputCloud(cloud2);
shot.setInputNormals(normals2);
shot.compute(*descriptors2);
// 将SHOT描述子转换为二进制编码
pcl::PointCloud<pcl::Histogram<1536>>::Ptr shot_binary1(new pcl::PointCloud<pcl::Histogram<1536>>());
pcl::PointCloud<pcl::Histogram<1536>>::Ptr shot_binary2(new pcl::PointCloud<pcl::Histogram<1536>>());
pcl::SHOTColorEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<1536>> shot_color;
shot_color.setInputCloud(cloud1);
shot_color.setInputNormals(normals1);
shot_color.setSearchMethod(tree);
shot_color.setRadiusSearch(0.02);
shot_color.setInputCloud(descriptors1);
shot_color.compute(*shot_binary1);
shot_color.setInputCloud(cloud2);
shot_color.setInputNormals(normals2);
shot_color.setInputCloud(descriptors2);
shot_color.compute(*shot_binary2);
// 计算相似矩阵
pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints1(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints2(new pcl::PointCloud<pcl::PointXYZ>());
// 对cloud1和cloud2进行关键点提取,将结果保存到keypoints1和keypoints2中
pcl::CorrespondencesPtr correspondences(new pcl::Correspondences());
pcl::registration::CorrespondenceEstimation<pcl::Histogram<1536>, pcl::Histogram<1536>> est;
est.setInputSource(shot_binary1);
est.setInputTarget(shot_binary2);
est.determineCorrespondences(*correspondences);
// 计算相似度
double sim_score = 0.0;
for (size_t i = 0; i < correspondences->size(); ++i) {
sim_score += correspondences->at(i).distance;
}
sim_score /= correspondences->size();
```
这里假设已经读取了两个点云数据到`cloud1`和`cloud2`中,并计算了它们的法向量信息保存到`normals1`和`normals2`中。首先使用`pcl::SHOTEstimationOMP`计算点云的SHOT描述子,然后使用`pcl::SHOTColorEstimation`将描述子转换为二进制编码。接着,使用`pcl::CorrespondenceEstimation`计算两个点云之间的相应关系,并通过计算相似度得到它们的相似度得分。
阅读全文