(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)
注释:本文翻译自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括对原文档种错误代码的纠正
1.简介
SIFT和SURF在它们的工作方面表现出色,但是如果你需要每年支付几美元才能将其应用于程序,那该怎么办呢?是的,因为它们是专利!为了解决这个问题,OpenCV开发提出一个新的“免费”方法替代SIFT和SURF,它就是ORB。
2.目标
这一章中学习ORB的知识。
3.理论
作为OpenCV爱好者,关于ORB最重要的是它来自于“OpenCV实验室”,Ethan Rublee,Vincent Rabaud,Kurt Konolige和Gary R. Bradski在他们的论文ORB:2011年对SIFT或SURF的高效替代方案中提出了该算法。正如标题所说,它是计算SIFT和SURF的一个很好的替代方案。
ORB基本上是使用FAST关键点检测器和BRIEF描述符的融合,并具有许多修改以提高性能。首先使用FAST算法查找关键点,然后应用Harris角点检测来查找其中的前N个点。它也使用金字塔来产生多尺度特征。但一个问题是,FAST不计算方向。那么旋转不变性呢?作者提出了以下修改:
它计算位于中心位置较角的贴片的强度加权质心。从这个角点到质点的矢量的方向给出方向。为了改善旋转不变性,用x和y来计算矩,其应该在半径位r的圆形区域中,其中r是贴片的大小。
现在对于描述符,ORB使用BRIEF描述符,但是我们已经看到,由于轮换,BRIEF表现不佳。所以ORB所做的就是根据关键点的方向来“引导”BRIEF。对于位置在处的任何n个二元测试的特征集合,定义包含这些像素的坐标的的矩阵。然后使用贴片的方向\theta,找到它的旋转矩阵并旋转。以得到导向(旋转)的版本。
ORB将角度离散为(12度)的增量,并构造一个预先计算的BRIEF模式的查找表。只要关键点方向在视图中是一致的,正确的一组点将被用来计算它的描述符。
BRIEF有一个重要的特性,即每个位特征具有很大的方差和接近0.5的平均值。但一旦以关键点为导向,它就会失去这种属性并变得更加分散。高方差使特征更具有区别性,因为它对输入进行差异化响应。另一个理想的特性是让测试不相关,因为那样每个测试都会对测试结果产生影响。为了解决所有这些问题,ORB在所有可能的二进制测试中执行贪婪搜索,以找到既具有高方差又具有接近0.5的平均值以及不相关的方法。结果被称为rBRIEF。
对于描述符匹配,使用改进传统LSH的多探针LSH。该论文称ORB比SURF和SIFT快得多,ORB描述符比SURF更好。 ORB是全景拼接等低功耗设备的理想选择。
4.OpenCV中的ORB
像往常一样,我们必须使用cv2.ORB_create()或使用feature2d通用接口创建一个ORB对象。它有许多可选参数,最有用的是nFeatures,它表示要保留的特征的最大数量(默认是500),scoreType表示用于对特征进行排名的harris分数或FAST分数(默认情况下是Harris分数)等。另一个参数WTA_K决定点数产生定向的BRIEF描述符的每个元素。默认情况下,它是两个,即一次选择两个点。在这种情况下,为了匹配,使用NORM_HAMMING距离。如果WTA_K是3或4,需要3或4个点来生成BRIEF描述符,则匹配距离由NORM_HAMMING2定义。
以下是显示ORB的简单代码:
# -*- coding: utf-8 -*-
'''
(ORB:Oriented FAST and Rotated BRIEF)面向Fast算法和旋转BRIEF
1.SIFT和SURF是专利,用在应用程序中需要每年付费。
2.所以提出一个免费替代SIFT和SURF,那就是ORB。
3.ORB基本上是FAST关键点检测器和BRIEF描述符的融合,并具有许多修改以提高性能。
首先使用FAST查找关键点,然后应用Harris角点检测来查找其中的前N个点,它也使用金字塔来产生多尺度特征。
但一个问题时,FAST不计算方向,那么旋转不变性呢?提出的修改是,让ORB计算中心位置角的贴片的强度加权值质心。
从这个角点到质心的矢量方向给出方向。为了改善旋转不变性,用x和y来计算矩,其应该在半径为r的圆圈区域中,
其中r是贴片的大小。
4.BRIEF有一个重要特性:即每个位特征具有很大的方差和接近0.5的平均值。
但一旦以关键点为导向,它就会失去这种属性并变得更加分散,高方差使特征更具有区别性,因为它对输入进行差异化响应。
另一个理想特性是让测试不相关,因为那样每个测试都会对测试结果产生影响。
为了解决所有这些问题,ORB在所有可能的二进制测试中执行贪婪搜索,以找到既具有高方差又具有接近0.5的平均值以及
不相关的方法。结果被称为rBRIEF。
5.OpenCV中的ORB:cv2.ORB_create(),ORB特征匹配,在另一章做。
'''
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('5.jpg', 0)
# 创建ORB
orb = cv2.ORB_create()
# 找到ORB中的关键点
kp = orb.detect(img, None)
# 使用ORB计算描述符
kp, des = orb.compute(img, kp)
# 只绘制关键点、位置,不绘制大小和方向
img2 = cv2.drawKeypoints(img, kp, None, color=(0, 255, 0), flags=0)
plt.imshow(img2), plt.show()
结果如下:ORB特征匹配,将在下一章做。
下一篇: (四)OpenCV中的特征检测之特征匹配