OpenCV-Python教程:39.BRIEF

理论

我们知道SIFT使用128维向量做描述子,由于它使用浮点数,需要512字节,同样的SURF也需要最小256字节(64维),创建上千个这样的向量需要很多内存,在资源受限的应用场景特别是嵌入式环境这是不可能的。越大的内存,匹配时间就越长。

但是实际上在匹配的时候不需要所有的这些维度,我们可以使用一些方法比如PCA,LDA等压缩他们,即使是其他方法入LSH(本地敏感hash)把这些浮点的SIFT描述子转换成二进制字符串,这些二进制字符串用来通过Hamming距离匹配特征。这提供了更好的速度,因为找hamming距离只是做异或和位运算,在现代有SSE指令的CPU来说非常快,但是我们需要先找到描述子,然后我们只是能使用hash,还是没有解决内存的问题。

BRIEF在这个时候出现了,它提供了直接找到二进制字符串而不找描述子的简便办法。它取被平滑过的图像块,选择nd(x,y)集合位置对,然后在这些位置对上做像素强度对比,比如,设第一个位置对为p和q,如果I(p) < I(q),那么它的结果是1,否则是0,这用在所有nd个位置对,得到nd维的位串。

这里nd可以是128,256或者512.OpenCV支持所有这些,但是默认是256(OpenCV用字节表示,所以就是16,32和64字节)。当你得到这个,你可以使用Hamming距离来匹配这些描述子

一个重要的点是BRIEF是一个特征描述子,它不提供任何方法来找特征,所以你还得使用别的特征描述子比如SIFT,SURF等,论文推荐使用CenSurE,是个快速检测器,BRIEF甚至和CenSurE比SURF还好点。

简单说,BRIEF是一个快速的特征描述子计算和匹配方法。它提供了高识别率,除非是大的平面旋转

OpenCV里的BRIEF

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('simple.jpg',0)

# Initiate STAR detector
star = cv2.FeatureDetector_create("STAR")

# Initiate BRIEF extractor
brief = cv2.DescriptorExtractor_create("BRIEF")

# find the keypoints with STAR
kp = star.detect(img,None)

# compute the descriptors with BRIEF
kp, des = brief.compute(img, kp)

print brief.getInt('bytes')
print des.shape

函数brief.getInt('bytes')给的nd大小是字节,默认是32。

你可能感兴趣的:(OpenCV-Python教程:39.BRIEF)