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

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位)

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值