为什么cv2.NORM_HAMMING给出的值与实际汉明距离不同?

时间:2019-02-19 09:33:53

标签: python opencv distance hamming-distance

我正在使用Hamming Distance来计算BRISK descriptor from opencv获得的两个关键点描述符之间的差异。我遵循suggestion of opencv documentation并使用 cv2.NORM_HAMMING 来计算距离,如下所示:

dist_opencv = cv2.norm(des_1,des_2,cv2.NORM_HAMMING)

它在两个描述符之间提供了一个值87.0。但是,根据Hamming Distance描述,这是不正确的。我遵循两种替代方法(在python中实现)进行验证:

dist_alt_app_1 = len(np.where(np.abs(des_1 - des_2)>0)[0])
dist_alt_app_2 = sum(el1 != el2 for el1, el2 in zip(des_1, des_2))

dist_alt_app_1和dist_alt_app_2都提供一个值43,该值与从opencv获得的87.0不同。进行了一些搜索以了解造成这种差异的原因。但是没有找到解释和澄清。

任何人都可以对这种差异进行解释吗?预先感谢。

============== 在此处添加示例(以使问题更笼统):

des_1 = [180  25 195  96  96  88   0   0]
des_2 = [244  27 195  96  96 192   0   0]

对于上述两个描述符dist_opencv = 5.0,其他两个描述符(dist_alt_app_1和dist_alt_app_2)给出3。而正确的汉明距离为3,为什么opencv提供5.0?

1 个答案:

答案 0 :(得分:3)

您的值:

180  25 195  96  96  88   0   0 
244  27 195  96  96 192   0   0

以二进制格式

10110100 ‭00011001‬ ‭11000011‬ ‭01100000‬ ‭01100000‬ ‭01011000‬ 00000000 00000000
‭11110100‬ ‭00011011‬ ‭11000011‬ ‭01100000‬ ‭01100000‬ ‭‭11000000‬ 00000000 00000000
 ^             ^                             ^  ^^

我计算出5个差异=>汉明距离为5 => OpenCV是正确的


提示:

您可以通过对两个值进行XOR运算后计算“ 1”的数目来计算两个值之间的汉明距离。伪代码:

HammingDistance = count_1(xor(val1, val2))

01011000
‭‭11000000‬ 
-------- xor
10011000 => it has 3 "1"