目标

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

理论

我们知道SIFT使用128维矢量作为描述符。由于它使用浮点数,因此基本上需要512个字节。同样,SURF最少也需要256个字节(用于64像素)。为数千个功能部件创建这样的向量会占用大量内存,这对于资源受限的应用程序尤其是嵌入式系统而言是不可行的。内存越大,匹配所需的时间越长。

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

现在介绍BRIEF。它提供了一种直接查找二进制字符串而无需查找描述符的快捷方式。它需要平滑的图像补丁,并以独特的方式(在纸上展示)选择一组nd(x,y)n_d(x,y)nd​(x,y)位置对。然后,在这些位置对上进行一些像素强度比较。例如,令第一位置对为ppp和qqq。如果I(p)<I(q)I(p)< I(q)I(p)<I(q),则结果为1,否则为0。将其应用于所有ndn_dnd​个位置对以获得ndn_dnd​维位串。

该ndn_dnd​可以是128、256或512。OpenCV支持所有这些,但默认情况下将是256(OpenCV以字节为单位表示,因此值将为16、32和64)。因此,一旦获得此信息,就可以使用汉明距离来匹配这些描述符。

重要的一点是,BRIEF是特征描述符,它不提供任何查找特征的方法。因此,您将不得不使用任何其他特征检测器,例如SIFT,SURF等。本文建议使用CenSurE,它是一种快速检测器,并且BIM对于CenSurE点的工作原理甚至比对SURF点的工作要好一些。

简而言之,BRIEF是一种更快的方法特征描述符计算和匹配。除了平面内旋转较大的情况,它将提供很高的识别率。

OpenCV中的BRIEF

下面的代码显示了借助CenSurE检测器对Brief描述符的计算。(在OpenCV中,CenSurE检测器称为STAR检测器)注意,您需要使用opencv contrib)才能使用它。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg',0)
# 初始化FAST检测器
star = cv.xfeatures2d.StarDetector_create()
# 初始化BRIEF提取器
brief = cv.xfeatures2d.BriefDescriptorExtractor_create()
# 找到STAR的关键点
kp = star.detect(img,None)
# 计算BRIEF的描述符
kp, des = brief.compute(img, kp)
print( brief.descriptorSize() )
print( des.shape )

函数brief.getDescriptorSize()给出以字节为单位的ndn_dnd​大小。默认情况下为32。下一个是匹配项,这将在另一章中进行。

附加资源

  1. Michael Calonder, Vincent Lepetit, Christoph Strecha, and Pascal Fua, “BRIEF: Binary Robust Independent Elementary Features”, 11th European Conference on Computer Vision (ECCV), Heraklion, Crete. LNCS Springer, September 2010.
  2. LSH (Locality Sensitive Hashing) at wikipedia.

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

OpenCV中文官方文档:

http://woshicver.com/

最新文章

  1. 利用 Android Gradle 瘦身 apk
  2. js 变量提升和函数提升原理
  3. CGAffineTransformMakeRotation 实现旋转
  4. Ext4,Ext3的特点和区别(转)
  5. sql语句增删改查(转)
  6. TamperData火狐插件启用
  7. 动态规划(背包问题):POJ 1742 Coins
  8. 洛谷 P1515 旅行
  9. 知问前端--Ajax
  10. 响应式内容滑动插件bxSlider
  11. 学生选课系统 c语言
  12. kubernetes进阶之二:概述
  13. Spring钩子方法和钩子接口的使用详解
  14. App后台Keynote
  15. django后台使用MySQL情况下的事务控制详解
  16. gcc static静态编译选项提示错误修正(/usr/lib/ld: cannot find -lc)
  17. Angular动态表单生成(七)
  18. Linux——CentOS7添加/删除用户和用户组(学习笔记)
  19. GeSHi Documentation
  20. Workflow_将一个消息同时发给通过用户(案例)

热门文章

  1. Python爬虫-百度模拟登录(一)
  2. 3——PHP 简单运算符的使用
  3. linux入门系列16--文件共享之Samba和NFS
  4. 想要成为一名优秀的Java程序员,你需要这8个锦囊
  5. criteria.setCacheable(true);这个方法是干什么用的
  6. Java 八种基本类型和基本类型封装类
  7. 【猫狗数据集】谷歌colab之使用pytorch读取自己数据集(猫狗数据集)
  8. NSInteger打印以及字符串的转换
  9. C语言程序设计(六) 循环控制结构
  10. CSS核心概念之盒子模型