ORB (Oriented FAST and Rotated BRIEF)
分為兩部分:
- 特征點提取 -由FAST(Features from Accelerated Segment Test)算法發(fā)展來的
- 特征點描述 -根據(jù)BRIEF(Binary Robust IndependentElementary Features)特征描述算法改進的
具體不詳述干像,數(shù)學原理對我來說需要一段時間去理解消化烘挫,網(wǎng)上的相關(guān)的介紹也很多井联。這里先從實例開始年鸳,學習怎么用這個工具绕沈。
ORB特征提取實驗
基于opencv3.2.0的ORB特征提取試驗
import numpy as np
import cv2
img1 = cv2.imread("data/face1.jpg",0)#導入灰度圖像
img2 = cv2.imread("data/face2.jpg",0)
def drawMatches(img1, kp1, img2, kp2, matches):
rows1 = img1.shape[0]
cols1 = img1.shape[1]
rows2 = img2.shape[0]
cols2 = img2.shape[1]
out = np.zeros((max([rows1,rows2]),cols1 + cols2, 3),dtype = 'uint8')
#拼接圖像
out[:rows1, :cols1] = np.dstack([img1, img1,img1])
out[:rows2, cols1:] = np.dstack([img2, img2,img2])
for mat in matches:
img1_idx = mat.queryIdx
img2_idx = mat.trainIdx
(x1,y1) = kp1[img1_idx].pt
(x2,y2) = kp2[img2_idx].pt
#繪制匹配點
cv2.circle(out, (int(x1),int(y1)),4,(255,255,0),1)
cv2.circle(out,(int(x2)+cols1,int(y2)),4,(0,255,255),1)
cv2.line(out,(int(x1),int(y1)),(int(x2)+cols1,int(y2)),(255,0,0),1)
return out
detector = cv2.ORB_create()
kp1 = detector.detect(img1,None)
kp2 = detector.detect(img2,None)
kp1,des1 = detector.compute(img1,kp1)
kp2,des2 = detector.compute(img2,kp2)
bf = cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck = True)
matches = bf.match(des1,des2)
img3 = drawMatches(img1,kp1,img2,kp2,matches[:50])
# img3 = cv2.drawKeypoints(img1,kp,None,color = (0,255,0),flags = 0)
cv2.imwrite("orbTest.jpg",img3)
cv2.imshow('orbTest',img3)
cv2.waitKey(0)
實驗結(jié)果:
然后也可以對比下AKAZE膝昆,只要將改成
detector = cv2.ORB_create()
改成
detector = cv2.AKAZE_create()
效果圖:
可以看出熄捍,AKAZE配對正確的數(shù)量大于ORB典格。
關(guān)于AKAZE和orb的比較列敲,可以參考文章:
http://www.epacis.net/ccis2016/papers/paper_121.pdf
這里復習了一下Python特性之切片阱佛,在拼接圖片時用到了:
例如:
list[1:3],表示返回從位置1開始戴而,包括位置2凑术,但是停止在位置3的一個序列切片,因此返回一個含有兩個項目的切片所意。
out[:rows1, :cols1] 行:從0開始淮逊,到rows1之前催首;列:從0開始,到cols1之前
out[:rows2, cols1:] 行:從0開始泄鹏,到rows2之前郎任;列:從cols1開始,到最后
補充說明:
在opencv2中备籽, orb = cv2.ORB ()是對的舶治;
在opencv3中這樣會報錯,改成orb = cv2.ORB_create()就沒問題了车猬。