【翻译:OpenCV-Python教程】更快速且支持旋转的BRIEF算法

⚠️由于自己的拖延症,3.4.3翻到一半,OpenCV发布了4.0.1了正式版,所以接下来是按照4.0.1翻译的。

⚠️除了版本之外,其他还是照旧,ORB (Oriented FAST and Rotated BRIEF),原文

目标

在本章,

  • 我们将学到ORB算法的基础

理论

作为一个OpenCV爱好者,ORB最重要的一点是它来自"OpenCV Labs"。这个算法是由Ethan Rublee,Vincent Rabaud,Kurt Konolige还有Gary R. Bradski在他们2011年的论文 ORB: An efficient alternative to SIFT or SURF 里提出的。就和这个标题说的一样,在计算消耗、匹配表现、还有专利方面,这是个非常好的替代SIFT和SURF的方案。没错,SIFT 和 SURF 这两种算法是申请了专利的,理论上说你要用得为他们付钱,但ORB没有。

ORB 基本上一个FAST关键点检测算法和BRIEF描述符算法的融合。通过很多修改来提升了性能。首先它使用FAST算法来找出关键点,然后应用哈里斯角点测量来找出其中前N个关键点。它还使用了图像金字塔来产生多比例尺度特征。但有个问题是,FAST算法没有计算旋转的问题。所以这个旋转不变性怎么办呢?作者想出了以下修改方式。

它计算出以角点为圆心的邻域内的强度加权质心。从角点到这个质心的矢量方向,就是可以得出角点的方向角度。为了提高旋转不变性,我们用x和y来计算力矩,它们应该在半径为r的圆形区域内,其中r是这个邻域圆的半径大小。

接下来对于描述符,ORB使用BRIEF描述符。但我们使用看到了BRIEF在旋转时的性能表现不佳。所以ORB算法通过关键点的方向来"引导"BRIEF算法。对于任意位置(xi,yi)二进制测试的特征集,定义一个2 x n矩阵,S包含这些像素的坐标。然后使用邻域计算出的方向,θ,发现其旋转矩阵然后旋转S,来拿到旋转(引导)后的版本Sθ。

ORB算法 将角度离散化,每2π/30 (12 度)一个刻度,并构造一个按BRIEF算法预先计算的模式查找表。只要关键点的朝向θ通过试图确定,正确的点集Sθ就会被用于计算它的描述符。

BRIEF 有一个重要的特性是,每一个特征都有很大的方差,均值接近0.5。但是,一旦它沿着关键点方向定向,它就会失去这个特性,变得更加分散。高方差使得一个特征变的更加有鉴别力,因为它会对输入有区别的响应。另一个可取的特性是使测试不相关,因为这样每个测试都会对结果有所贡献。为了解决所有这些问题,ORB在所有可能的二进制测试中运行贪婪搜索,以找到方差和平均值都接近0.5且不相关的测试。结果称为rBRIEF

对于描述符匹配,采用了传统LSH的基础上改进的多探针LSH。论文说ORB比SURF和SIFT快得多,而ORB描述符比SURF工作得更好。ORB是低功耗全景拼接等设备的理想选择。

OpenCV里的ORB

与往常一样,我们必须创建一个ORB对象,通过函数 cv.ORB() 。或者使用 feature2d 公共接口。它有多个可选参数。最有用的几个,是nFeatures,它表示要保留特征的最大数量(默认是500),scoreType  表示是在为特征点排序时,是要用哈里斯的方式来计分还是使用FAST算法来计分(默认是哈里斯的计分算法)等等。还有个参数,WTA_K 决定产生有方向的BRIEF描述符的每个元素点的数目。默认情况下是两个,因为两点决定一条线。这种情况下,使用汉明距离(译者注:NORM_HAMMING distance,汉明距离)用于匹配。如果WTA_K 是 3 或者 4,那就需要取3 或者 4 个点来产生 BRIEF描述符,那么匹配距离就被定义为二类汉明距离(NORM_HAMMING2)。

下面是一个简单的代码,展示了ORB的使用。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg',0)
# Initiate ORB detector
orb = cv.ORB_create()
# find the keypoints with ORB
kp = orb.detect(img,None)
# compute the descriptors with ORB
kp, des = orb.compute(img, kp)
# draw only keypoints location,not size and orientation
img2 = cv.drawKeypoints(img, kp, None, color=(0,255,0), flags=0)
plt.imshow(img2), plt.show()

参见下面的结果:

orb_kp.jpg

ORB 特征匹配,我们会在另外一个章节来做。

额外资源

  1. Ethan Rublee, Vincent Rabaud, Kurt Konolige, Gary R. Bradski: ORB: An efficient alternative to SIFT or SURF. ICCV 2011: 2564-2571.(之前提到的论文)

Exercises


上篇:【翻译:OpenCV-Python教程】二元健壮独立基础特征

下篇:【翻译:OpenCV-Python教程】特征匹配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值