1. 程式人生 > >ORB中求Hamming距離(c++)

ORB中求Hamming距離(c++)

最近在查閱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;
}