(四)OpenCV中的特征检测之BRIEF(二进制强大的独立基本特征)

注释:本文翻译自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括对原文档种错误代码的纠正

1.概述

SIFT使用具有128个浮点数的特征描述符。 考虑成千上万个这样的特征 。 它需要大量的内存和更多的时间进行匹配。 我们可以压缩它以使其更快。 但是我们仍然必须先计算它。这里有BRIEF,它提供了寻找具有更少内存的二进制描述符的快捷方式,更快的匹配以及更高的识别率。

2.目标

在这一章中,我们将看到BRIEF算法的基础知识

3.理论

      我们知道SIFT使用128-dim矢量描述符。由于它使用浮点数,所以基本上需要512个字节。同样,SURF也至少需要256个字节(对于64-dim)。为数千个特征创建一个向量需要大量内存,这对于资源约束应用程序尤其是嵌入式系统来说是不可行的。内存越大,匹配时间越长。

      但是实际匹配可能不需要所有这些维度。我们使用PCA、LDA等几种方法对其进行压缩。即使使用LSH(局部敏感散列)等散列方法,也可以将浮点数中的这些SIFT描述符转换为二进制字符串,这些二进制字符串用于匹配使用汉明距离的特征,这提供了更好的加速,因为查找汉明距离只是应用XOR和位计算,在具有SSE指令的现代CPU中非常快。但是在这里,我们首先需要找到描述符,然后我们只能应用散列,这并不能解决我们最初的内存问题。

       此刻BRIEF进入画面。它提供了查找二进制字符串的快捷方式,无需查找描述符。它采用平滑图像补丁并以独特的方式选择一组(x,y)位置对(在论文中进行了解释)。然后在这些位置对上完成一些像素强度比较。例如,让第一个位置对是p和q,如果I(p)<I(q),那么它的结果是1,否则它是0.这适用于所有位置对以获得维位串。

       这个可以是128,256或512。OpenCV支持所有这些,但默认情况下,它将是256(OpenCV以字节表示,因此这些值i昂是16,32和64)。所以一旦你得到这个,你可以使用汉明(Hamming)距离来匹配这些描述符。

       重要的一点是BRIEF是一个特征描述符,它不提供任何方法来查找特征。因此,你不得不使用任何其它特征探测器,如SIFT、SURF等。本文建议使用CenSurE,它是一种快速检测器,而且对于CenSurE点,BRIEF比SURF点的效果稍好。

       总之,BRIEF是一种更快的方法特征描述符计算和匹配。除非有大的面内旋转,否则它还提供高识别率。

4.OpenCV中的BRIEF

       下面的代码显示了借助CenSurE探测器计算BRIEF描述符。(CenSurE探测器在OpenCV中称为STAR探测器)

# -*- coding: utf-8 -*-
'''
二进制独立鲁棒特征
BRIEF(Binary Robust Independent Elementary Features)
1.SIFT使用128-dim矢量描述符,由于它使用浮点数,所以基本上需要512个字节。
2.同样SURF也至少需要256字节(对于64-dim)。
问题就是:为数千个特征创建一个向量需要大量内存,这对于资源约束程序尤其是嵌入式系统来说是不行的,内存越大匹配时间越长。
但实际匹配可能不需要所有这些维度,可以使用PCA、LDA等几种降维算法进行压缩。
BRIEF实际上是一个特征描述符,不提供任何方法来查找特征。因此不得不使用其它特征检测器,如SIFT,SURF等。
还有CenSurE,它是一种快速检测器,而且比SIFT和SURF效果稍好。
In total,BRIEF是一种更快的方法特征描述符计算和匹配。除非有大的面内旋转,否则它还提供高识别率。
下面的Demo:借助CenSurE探测器计算BRIEF描述符。(CenSurE探测器在OpenCV中称为STAR探测器)
'''

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

img = cv2.imread('5.jpg', 0)
# 初始化STAR探测器,官网文档中是star = cv2.FeatureDetector_create()对于这个版本是错误的!
star = cv2.xfeatures2d.StarDetector_create()
print('help of FeatureDetector_create', help(star))
# 初始化BRIEF探测器,官网文档是brief = cv2.DescriptorExtractor_create("BRIEF"),对于这个版本也是错误的
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
print('help of brief', help(brief))

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

# 用BRIEF计算描述符
kp, des = brief.compute(img, kp)

'''
下一步的工作是匹配:

'''

猜你喜欢

转载自blog.csdn.net/u014403318/article/details/80567573
今日推荐