读“orbslam特征点的计算和描述子的计算,汉明距离匹配”的ORB 描述子计算总结

1. ORB特征点的选取方法是FAST特征点选取方法。具体查看FAST,简单地,就是通过比较某一点的像素与其周边的其他像素的灰度值,如果该点周围有足够多的点的灰度值与该点的灰度值差别足够大,则认为其是特征点。在OpenCV中的FAST算法还具有一定的优化。通过先比较对角线上的点或者是先比较某一个半径内的点的灰度值差别。

2. 描述子的计算方法。在特征点某一范围内按照某一模式来选区点对儿(A点和B点),然后比较每一个点对儿的灰度值,A大于B的记作1,A小于B的记作0,这样这个特征点就有了自己独有的二进制编码(BRIEF)。在ORB中为BRIEF增加了旋转不变性和尺度不变性,方法为:旋转不变性,通过当前特征点内周边像素的灰度值来当作这块区域的质量,则我们可以得到当前区域内的质心,连接特征点与质心作为坐标系X轴的正方向,为图像的旋转建立新的坐标系,则此特征点的坐标系就拥有了旋转不变性。尺度不变性则是依靠金字塔来进行了。

3. 特征点matching时,只需要比较每个特征点的二进制编码,比较二进制编码对应位置的数字差距并相加(汉明距离)。比如距离小于多少的或者相似度为80%的则认为匹配成功。

4. 其他的,算法中还会使用高斯滤波等方法降低图像噪声。以随机一对儿点后比较两个点周围某个范围内的像素的灰度值大小作为二进制描述子

5. 或者在以上的基础上,再增加一些可以加强描述子独有性的其他方法。修改的余地还是比较大的。

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 PCL 进行汉明距离特征匹配的示例代码: ```cpp 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("cloud1.pcd", *cloud1); pcl::io::loadPCDFile("cloud2.pcd", *cloud2); // 特征点提取 pcl::HarrisKeypoint3D<pcl::PointXYZ, pcl::PointXYZI> harris; pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints1(new pcl::PointCloud<pcl::PointXYZI>); pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints2(new pcl::PointCloud<pcl::PointXYZI>); harris.setInputCloud(cloud1); harris.setNonMaxSupression(true); harris.setRadius(0.05); harris.compute(*keypoints1); harris.setInputCloud(cloud2); harris.compute(*keypoints2); // 描述计算 pcl::SHOTColorEstimation<pcl::PointXYZ, pcl::PointXYZI, pcl::SHOT1344> shot; pcl::PointCloud<pcl::SHOT1344>::Ptr descriptors1(new pcl::PointCloud<pcl::SHOT1344>); pcl::PointCloud<pcl::SHOT1344>::Ptr descriptors2(new pcl::PointCloud<pcl::SHOT1344>); shot.setInputCloud(cloud1); shot.setInputNormals(cloud1); shot.setRadiusSearch(0.1); shot.setInputCloud(keypoints1); shot.compute(*descriptors1); shot.setInputCloud(cloud2); shot.setInputNormals(cloud2); shot.setInputCloud(keypoints2); shot.compute(*descriptors2); // 特征匹配 pcl::CorrespondencesPtr correspondences(new pcl::Correspondences); for (size_t i = 0; i < keypoints1->size(); ++i) { int min_index = -1; float min_distance = std::numeric_limits<float>::max(); for (size_t j = 0; j < keypoints2->size(); ++j) { float distance = pcl::getHammingDistance((*descriptors1)[i].descriptor, (*descriptors2)[j].descriptor); if (distance < min_distance) { min_distance = distance; min_index = j; } } if (min_index >= 0) { pcl::Correspondence correspondence(i, min_index, min_distance); correspondences->push_back(correspondence); } } // 输出匹配结果 std::cout << "Found " << correspondences->size() << " correspondences." << std::endl; ``` 该代码中使用了 PCL 中的 HarrisKeypoint3D 和 SHOTColorEstimation 进行特征点的提取和描述符的计算,然后使用 getHammingDistance 函数计算汉明距离,并将最小距离的点对作为匹配结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值