OpenCV-Python教程:40.ORB

理論

關(guān)于ORB最重要的事情是它是OpenCV實(shí)驗(yàn)室出來的,它在計(jì)算成本,匹配性能上是SIFT和SURF很好的替代品,還有最主要的,專利,對(duì),SIFT和SURF都是有專利的,你得付費(fèi)試用,但是ORB不是

ORB基本上是一個(gè)FAST關(guān)鍵點(diǎn)檢測(cè)和BRIEF描述子的融合,同時(shí)做了很多修改提高了性能。首先它使用FAST來找關(guān)鍵點(diǎn),然后用Harris角點(diǎn)測(cè)量來找到頭N個(gè)點(diǎn)。還使用金字塔來產(chǎn)生多層級(jí)特征,但是問題是FAST不計(jì)算方向,所以旋轉(zhuǎn)不變呢?作者做了如下修改。

它計(jì)算定位的角點(diǎn)小塊質(zhì)心的亮度權(quán)重,這個(gè)角點(diǎn)到質(zhì)心的向量的方向就是方向,要改進(jìn)旋轉(zhuǎn)不變,通過x和y計(jì)算應(yīng)該在圓形區(qū)域的半徑r,r是這小塊的大小。

現(xiàn)在對(duì)于描述子,ORB使用BRIEF描述子,但是我們已經(jīng)看到了BRIEF對(duì)旋轉(zhuǎn)處理很差,所以O(shè)RB做的是按關(guān)鍵點(diǎn)的方向引導(dǎo)BRIEF。對(duì)于任何位置(xi, yi)的n個(gè)二進(jìn)制測(cè)試的特征集合。定義一個(gè)2xn的矩陣,S包含這些像素的坐標(biāo),然后使用方塊的方向θ,它的旋轉(zhuǎn)矩陣被找到,并旋轉(zhuǎn)S得到旋轉(zhuǎn)后的Sθ.

ORB把角度離散成2π/30(12度),構(gòu)建一個(gè)預(yù)計(jì)算BRIEF模式的查找表,只要關(guān)鍵點(diǎn)方向θ,Sθ的正確集合就會(huì)被用來計(jì)算它的描述子。

BRIEF有一個(gè)重要的屬性,每個(gè)位特征有一個(gè)大的變化,差接近0.5.但是當(dāng)他和關(guān)鍵點(diǎn)方向一致,它丟失了這個(gè)屬性變得更加分散。高不一致使得一個(gè)特征值更加有區(qū)分姓,因?yàn)樗麑?duì)輸入的響應(yīng)更加多樣。另一個(gè)想要的屬性是有不相關(guān)測(cè)試,因?yàn)槊總€(gè)測(cè)試會(huì)對(duì)結(jié)果有貢獻(xiàn),要解決這個(gè),ORB使用一個(gè)貪婪搜索所有可能的二進(jìn)制測(cè)試來找既有高不一致并且差接近0.5的,如果不相關(guān),結(jié)果就被叫做rBRIEF。

對(duì)于匹配的描述子,使用了多探針LSH提高傳統(tǒng)的LSH。論文說ORB比SURF和SIFT都快很多并且ORB描述子做的也比SURF好。ORB是一個(gè)低性能設(shè)備做全景拼接的好選擇

OpenCV里的ORB

和通常一樣,我們需要用函數(shù)cv2.ORB()建立一個(gè)ORB對(duì)象,或者使用一個(gè)feature2d通用接口。有很多可選參數(shù)據(jù),最有用的一個(gè)是nFeature,用來指明要保留的特征值的最大數(shù)量(默認(rèn)是500)。scoreType指明是Harris分?jǐn)?shù)或者FAST分?jǐn)?shù)來給特征評(píng)分(默認(rèn)是Harris分?jǐn)?shù))。另一個(gè)參數(shù)WTA_K決定要產(chǎn)生有方向的BRIEF描述子的每個(gè)元素的點(diǎn)的數(shù)量。默認(rèn)是2,一次選擇兩個(gè)點(diǎn)。對(duì)于匹配,使用NORM_HAMMING距離,如果WTA_K是3或者4,會(huì)取3或者4個(gè)點(diǎn)來產(chǎn)生BRIEF描述子,然后匹配距離是NORM_HAMMING2.

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('simple.jpg',0)

# Initiate STAR detector
orb = cv2.ORB()

# 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 = cv2.drawKeypoints(img,kp,color=(0,255,0), flags=0)
plt.imshow(img2),plt.show()

結(jié)果:

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容