OpenCV系列之ORB(面向快速和旋轉的BRIEF) | 四十三

目標
在本章中,算法

  • 咱們將瞭解ORB的基礎知識

理論
做爲OpenCV的狂熱者,關於ORB的最重要的事情是它來自「 OpenCV Labs」。該算法由Ethan Rublee,Vincent Rabaud,Kurt Konolige和Gary R. Bradski在其論文《ORB:SIFT或SURF的有效替代方案》中提出。2011年,正如標題所述,它是計算中SIFT和SURF的良好替代方案成本,匹配性能以及主要是專利。是的,SIFT和SURF已得到專利,你應該爲其使用付費。可是ORB不是!!!ide

ORB基本上是FAST關鍵點檢測器和Brief描述符的融合,並進行了許多修改以加強性能。首先,它使用FAST查找關鍵點,而後應用Harris角測度在其中找到前N個點。它還使用金字塔生成多尺度特徵。可是一個問題是,FAST沒法計算方向。那麼旋轉不變性呢?做者提出如下修改。函數

它計算角點位於中心的貼片的強度加權質心。今後角點到質心的矢量方向肯定了方向。爲了改善旋轉不變性,使用x和y計算矩,它們應該在半徑r的圓形區域中,其中r是斑塊的大小。性能

如今,對於描述符,ORB使用Brief描述符。可是咱們已經看到,BRIEF的旋轉性能不好。所以,ORB所作的就是根據關鍵點的方向「引導」 BRIEF。對於位置圖片上n個二進制測試的任何特徵集,定義一個2×n矩陣S,其中包含這些像素的座標。而後使用面片的方向θ,找到其旋轉矩陣並旋轉S以得到轉向(旋轉)版本圖片,測試

ORB將角度離散化爲圖片(12度)的增量,並構造了預先計算的Brief模式的查找表。只要關鍵點方向θ在各個視圖中一致,就將使用正確的點集來計算其描述符。code

BRIEF具備一個重要的特性,即每一個位特徵具備較大的方差,且均值接近0.5。可是,一旦沿關鍵點方向定向,它就會失去此屬性,變得更加分散。高方差使功能更具區分性,由於它對輸入的響應不一樣。另外一個理想的特性是使測試不相關,由於從那時起每一個測試都會對結果有所貢獻。爲了解決全部這些問題,ORB在全部可能的二進制測試中進行貪婪搜索,以找到方差高且均值接近0.5且不相關的測試。結果稱爲rBRIEF。對象

對於描述符匹配,使用了對傳統LSH進行改進的多探針LSH。該論文說,ORB比SURF快得多,而SIFT和ORB描述符比SURF更好。在全景拼接等低功耗設備中,ORB是一個不錯的選擇。blog

OpenCV中的ORB
與往常同樣,咱們必須使用函數cv.ORB()或使用feature2d通用接口來建立ORB對象。它具備許多可選參數。最有用的是nFeatures,它表示要保留的最大特徵數(默認爲500),scoreType表示是對特徵進行排名的Harris分數仍是FAST分數(默認爲Harris分數)等。另外一個參數WTA_K決定點數產生定向的BRIEF描述符的每一個元素。默認狀況下爲兩個,即一次選擇兩個點。在這種狀況下,爲了匹配,將使用NORM_HAMMING距離。若是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)
# 初始化ORB檢測器
orb = cv.ORB_create()
# 用ORB尋找關鍵點
kp = orb.detect(img,None)
# 用ORB計算描述符
kp, des = orb.compute(img, kp)
# 僅繪製關鍵點的位置,而不繪製大小和方向
img2 = cv.drawKeypoints(img, kp, None, color=(0,255,0), flags=0)
plt.imshow(img2), plt.show()

查看如下結果:圖片

OpenCV系列之ORB(面向快速和旋轉的BRIEF) | 四十三
ORB特徵匹配,咱們將在另外一章中進行。

附加資源1.Ethan Rublee, Vincent Rabaud, Kurt Konolige, Gary R. Bradski: ORB: An efficient alternative to SIFT or SURF. ICCV 2011: 2564-2571.

相關文章
相關標籤/搜索