欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)

程序员文章站 2022-07-14 15:42:16
...

注释:本文翻译自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。对于位置在(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)处的任何n个二元测试的特征集合,定义包含这些像素的坐标的(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)的矩阵(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)。然后使用贴片的方向\theta,找到它的旋转矩阵并旋转(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)。以得到导向(旋转)的版本(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)

      ORB将角度离散为(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)(12度)的增量,并构造一个预先计算的BRIEF模式的查找表。只要关键点方向(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转BRIEF)在视图中是一致的,正确的一组点(四)OpenCV中的特征检测之ORB(面向Fast算法和旋转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中的特征检测之ORB(面向Fast算法和旋转BRIEF)