在OpenCV里使用BRIEF

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/caimouse/article/details/102675589

BRIEF是Binary Robust Independent Elementary Features缩写。我们知道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是一个快速的特征描述子计算和匹配方法。它提供了高识别率,除非是存在大的平面旋转的情况。

CenSurE算法在OpenCV里叫做STAR算法,下面就使用它与BRIEF作演示:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt

#读取文件
img = cv2.imread('szcen1.png')

#初始化STAR检测算法
star = cv2.xfeatures2d.StarDetector_create()

#初始化BRIEF描述
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()

#用STAR查找关键点
kp = star.detect(img,None)

#使用BRIEF来描述这些关键点
kp, des = brief.compute(img, kp)

print('brief.descriptorSize()={}'.format(brief.descriptorSize()))
print('des.shape={}'.format(des.shape) )

#显示图片
cv2.imshow('img',img)
           
cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

brief.descriptorSize()=32

des.shape=(334, 32)

 

brief.getDescriptorSize()得到每个nd维使用多少字节表示,这里是使用32个字节。des.shape表示匹配大小。

https://blog.csdn.net/caimouse/article/details/51749579

 

猜你喜欢

转载自blog.csdn.net/caimouse/article/details/102675589