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