orb-slam中DescriptorDistance特征距离的计算

本文介绍了一种高效计算二进制位中1的个数的方法,通过位运算技巧实现,适用于256维描述子的匹配算法。该算法将32位数据分为多个小组进行并行计算,显著提高了计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ref:

  1. 计算二进制位1的个数
  2. 位运算的奇技淫巧

int ORBmatcher::DescriptorDistance (const cv::Mat &a, const cv::Mat &b) {
    // adapted from: http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
    const int *pa = a.ptr<int32_t>();
    const int *pb = b.ptr<int32_t>();
    int dist = 0;
    for(int i = 0; i < 8; i++, pa++, pb++) {
        unsigned  int v = *pa ^ *pb;
        v = v - ((v >> 1) & 0x55555555);
        v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
        dist += (((v + (v >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
    }
    return dist;
}​

描述子为256维,计算距离时取32维为一组.(也可以多,但是代码要改)

v = v - ((v >> 1) & 0x55555555);

这一句的意思是将32位分为16组,看每一组中有几个1.
0x55555555->0101 0101 0101 0101
假设某一组为11,则对应输出为10(两个1)

v = (v & 0x33333333) + ((v >> 2) & 0x33333333);

0x33333333->0011 0011 0011 0011
类似,这一句将32位分为8组,看的其实还是原来的那个数每8个单位里有几个1.
因为这里继承的v已经是第一句计算过的,所以这里其实是将上一步的2个bit为一组的数转化为这里的4个bit为一组.
如把1001(上一轮里面得到的,就是说有4个bit一共有3个1)转化为0011.

(v + (v >> 4)) & 0xF0F0F0F)

这里同样,分为4组,每组16bit.
*0x1010101并且>>24的意思是只保留下了原来的后8位.(因为我们已经知道这里最大值是256,也就是8位)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值