ORB中求Hamming距離(c++)
阿新 • • 發佈:2019-02-09
最近在查閱ORB演算法的相關資料,其中涉及到求兩個01字串間的hamming距離,作為度量兩個向量距離的值。在opencv庫中有結構體HammingLUT,來看看它的定義:
struct CV_EXPORTS Hamming { enum { normType = NORM_HAMMING }; typedef unsigned char ValueType; typedef int ResultType; /** this will count the bits in a ^ b */ ResultType operator()( const unsigned char* a, const unsigned char* b, int size ) const { return normHamming(a, b, size); } }; typedef Hamming HammingLUT;
在程式碼中的運用:
HammingLUT lut;
unsigned int result;
result = lut((a), (b), size);
其中a,b為字元陣列的首地址,size為需要比較的位數。舉個例子:unsigned char a[3]={'001','010','011'}, b[3]={'001','011','100'}(為了方便分析,採用的二進位制表示),那麼執行:
result = lut((a), (b), 1);
result = lut((a), (b), 2);
result = lut((a), (b), 3);
結果分別為0,1,4。可以看出,size=1,則是隻比較到a[1]與b[1],size=2,則是a[1]b[1],a[2]b[2]比較後累加,之後以此類推。
所以我自己也簡單寫了一個小函式HammingDist
//計算hamming距離
int HammingDis(unsigned char *s1, unsigned char *s2, int size)
{
int i, temp, num, dis=0;
for (i = 0; i < size; i++)
{
num = 0;
temp = s1[i] ^ s2[i];
while (temp)//按位統計1的數量
{
if (temp % 2)num++;
temp /= 2;
}
dis += num;
}
return dis;
}