OpenCV Python BRIEF ( Binary Robust Independent Elementary Features)
【理论】
我们知道SIFT使用128维向量作为描述符。因为它使用的是浮点数,所以需要512字节。类似地,SURF也需要最少256字节(对于64维)。为数千个特性创建这样的向量需要大量内存,这对于资源受限的应用程序是不可行的,特别是对于嵌入式系统,内存消耗大,匹配的时间长。
但这些维度在实际匹配时可能不是都需要。我们可以使用PCA、LDA等多种方法对数据进行压缩。甚至还使用其他方法,如使用LSH ( 局域敏感哈希) 来将这些浮点数中的 SIFT 描述符转换为二进制串。这些二进制字符串使用汉明距离来匹配特征。这提供了更好的加速,因为寻找汉明距离只是应用异或和位计数,这在具有SSE指令的现代cpu中非常快。但在这里,我们需要先找到描述符,然后才能应用哈希,这并不能解决我们最初的内存问题。
这时,BRIEF 浮现在眼前。它提供了直接查找二进制字符串的快捷方式,而无需查找描述符。它需要平滑的图像块,并以唯一的方式选择一组n d ( x , y ) n_d (x,y)n
d (x,y)位置对(在论文中解释)。然后对这些位置对进行像素强度比较。例如,设某一个位置对为p pp和q qq,如果 I ( p ) < I ( q ) I(p) < I(q)I(p)<I(q),则其结果为1,否则为0。这适用于所有的nd位置对,以获得一个nd维位串。
这个nd可以是128 256或512 。OpenCV支持所有这些,但默认情况下,它将是256 (OpenCV以字节表示, 所以这些值将是16,32和64)。一旦你得到了这个,你就可以用汉明距离来匹配这些描述符。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("assets/blox.jpg")
# fast检测
fast_kp = cv2.FastFeatureDetector_create()
# brief 描述子
brief = cv2.xfeatures2d.BriefDescriptorExtractor.create()
# 特征点检测
kp = fast_kp.detect(img, None)
print(len(kp))
# 计算特征
kp, des = brief.compute(img, kp)
print(len(kp))
# 画关键点
img2 = cv2.drawKeypoints(img, kp, None, color=(255,0,0), flags=0)
print(brief.descriptorSize())
star = cv2.xfeatures2d.StarDetector_create()
star_kp = star.detect(img, None)
img3 = cv2.drawKeypoints(img, star_kp, None, color=(255, 0, 0), flags=0)
print(len(star_kp))
cv2.imshow("fastkpafter", img2)
cv2.imshow("starkp", img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
Lnton 羚通BRIEF 特征广泛应用于计算机视觉领域,如目标识别、图像匹配和三维重建等任务。它与其他特征描述子(如SIFT和SURF)相比,具有计算速度快、内存占用小等优势。