摘要:匹配器匹配非常簡(jiǎn)單,首先在第一幅圖像中選取一個(gè)關(guān)鍵點(diǎn)然后依次與第二幅圖像的每個(gè)關(guān)鍵點(diǎn)進(jìn)行描述符距離測(cè)試,最后返回距離最近的關(guān)鍵點(diǎn)對(duì)于匹配器,首先我們必須使用創(chuàng)建對(duì)象。
Feature Matching
Brute-Force匹配器Brute-Force匹配非常簡(jiǎn)單,首先在第一幅圖像中選取一個(gè)關(guān)鍵點(diǎn)然后依次與第二幅圖像的每個(gè)關(guān)鍵點(diǎn)進(jìn)行(描述符)距離測(cè)試,最后返回距離最近的關(guān)鍵點(diǎn).
對(duì)于BF匹配器,首先我們必須使用cv2.BFMatcher()創(chuàng)建BFMatcher對(duì)象。它需要兩個(gè)可選的參數(shù).
第一個(gè)是normType,它指定要使用的距離測(cè)量,默認(rèn)情況下,它是cv2.NORM_L2.它適用于SIFT,SURF等(cv2.NORM_L1也在那里).對(duì)于基于二進(jìn)制字符串的描述符,如ORB,BRIEF,BRISK等,應(yīng)使用cv2.NORM_HAMMING,使用漢明距離作為度量,如果ORB使用WTA_K == 3or4,則應(yīng)使用cv2.NORM_HAMMING2.
crossCheck:默認(rèn)值為False。如果設(shè)置為T(mén)rue,匹配條件就會(huì)更加嚴(yán)格,只有到A中的第i個(gè)特征點(diǎn)與B中的第j個(gè)特征點(diǎn)距離最近,并且B中的第j個(gè)特征點(diǎn)到A中的第i個(gè)特征點(diǎn)也是最近時(shí)才會(huì)返回最佳匹配,即這兩個(gè)特征點(diǎn)要互相匹配才行.
兩個(gè)重要的方法是BFMatcher.match()和BFMatcher.knnMatch(), 第一個(gè)返回最佳匹配, 第二種方法返回k個(gè)最佳匹配,其中k由用戶(hù)指定.
使用cv2.drawMatches()來(lái)繪制匹配的點(diǎn),它會(huì)將兩幅圖像先水平排列,然后在最佳匹配的點(diǎn)之間繪制直線(xiàn)。如果前面使用的BFMatcher.knnMatch(),現(xiàn)在可以使用函數(shù)cv2.drawMatchsKnn為每個(gè)關(guān)鍵點(diǎn)和它的個(gè)最佳匹配點(diǎn)繪制匹配線(xiàn)。如果要選擇性繪制就要給函數(shù)傳入一個(gè)掩模.
Brute-Force Matching with ORB Descriptorsimport numpy as np import cv2 import matplotlib.pyplot as plt img1 = cv2.imread("img.jpg",0) # queryImage img2 = cv2.imread("img1.jpg",0) # trainImage # Initiate ORB detector orb = cv2.ORB_create() # find the keypoints and descriptors with ORB kp1, des1 = orb.detectAndCompute(img1,None) kp2, des2 = orb.detectAndCompute(img2,None) # create BFMatcher object bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # Match descriptors. matches = bf.match(des1,des2) # Sort them in the order of their distance. matches = sorted(matches, key = lambda x:x.distance) # Draw first 10 matches. img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10],None, flags=2) plt.imshow(img3),plt.show()Matcher對(duì)象
matches = bf.match(des1,des2)行的結(jié)果是DMatch對(duì)象的列表。 此DMatch對(duì)象具有以下屬性:
?DMatch.distance - 描述符之間的距離。 越低越好。
?DMatch.trainIdx - 訓(xùn)練描述符中描述符的索引
?DMatch.queryIdx - 查詢(xún)描述符中描述符的索引
?DMatch.imgIdx - 訓(xùn)練圖像的索引
import numpy as np import cv2 import matplotlib.pyplot as plt img1 = cv2.imread("img.jpg",0) # queryImage img2 = cv2.imread("img1.jpg",0) # trainImage # Initiate SIFT detector sift = cv2.xfeatures2d.SIFT_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # BFMatcher with default params bf = cv2.BFMatcher() matches = bf.knnMatch(des1,des2, k=2) # Apply ratio test good = [] for m,n in matches: if m.distance < 0.75*n.distance: good.append([m]) # cv.drawMatchesKnn expects list of lists as matches. img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) plt.imshow(img3),plt.show()基于FLANN的Matcher
FLANN 代表 Fast Library for Approximate Nearest Neighbors. 它包含一組算法,這些算法針對(duì)大型數(shù)據(jù)集中的快速最近鄰搜索和高維特征進(jìn)行了優(yōu)化.對(duì)于大型數(shù)據(jù)集,它比BFMatcher工作得更快.
import numpy as np import cv2 import matplotlib.pyplot as plt img1 = cv2.imread("img.jpg",0) # queryImage img2 = cv2.imread("img1.jpg",0) # trainImage # Initiate SIFT detector sift = cv2.xfeatures2d.SIFT_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # FLANN parameters FLANN_INDEX_KDTREE = 1 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) search_params = dict(checks=50) # or pass empty dictionary flann = cv2.FlannBasedMatcher(index_params,search_params) matches = flann.knnMatch(des1,des2,k=2) # Need to draw only good matches, so create a mask matchesMask = [[0,0] for i in range(len(matches))] # ratio test as per Lowe"s paper for i,(m,n) in enumerate(matches): if m.distance < 0.7*n.distance: matchesMask[i]=[1,0] draw_params = dict(matchColor = (0,255,0), singlePointColor = (255,0,0), matchesMask = matchesMask, flags = 0) img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params) plt.imshow(img3,),plt.show()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42073.html
摘要:理論我們知道使用向量作為描述符,由于它使用浮點(diǎn)數(shù),因此基本上需要個(gè)字節(jié),類(lèi)似地,也至少需要個(gè)字節(jié)對(duì)于,為數(shù)千個(gè)特征創(chuàng)建這樣的向量需要大量的內(nèi)存,這對(duì)于資源約束應(yīng)用程序尤其是嵌入式系統(tǒng)是不可行的,內(nèi)存越大,匹配所需的時(shí)間越長(zhǎng)實(shí)際匹配可能不 BRIEF (Binary Robust Independent Elementary Features) 理論 我們知道SIFT使用128-dim...
摘要:為了解決這個(gè)問(wèn)題,算法使用和可以通過(guò)參數(shù)來(lái)設(shè)定所以好的匹配提供的正確的估計(jì)被稱(chēng)為,剩下的被稱(chēng)為返回一個(gè)掩模,這個(gè)掩模確定了和點(diǎn) Feature Matching + Homography to find Objects 聯(lián)合使用特征提取和 calib3d 模塊中的 findHomography 在復(fù)雜圖像中查找已知對(duì)象. 之前在一張雜亂的圖像中找到了一個(gè)對(duì)象(的某些部分)的位置.這些...
摘要:十開(kāi)放模式識(shí)別項(xiàng)目開(kāi)放模式識(shí)別項(xiàng)目,致力于開(kāi)發(fā)出一套包含圖像處理計(jì)算機(jī)視覺(jué)自然語(yǔ)言處理模式識(shí)別機(jī)器學(xué)習(xí)和相關(guān)領(lǐng)域算法的函數(shù)庫(kù)。 一、開(kāi)源生物特征識(shí)別庫(kù) OpenBROpenBR 是一個(gè)用來(lái)從照片中識(shí)別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計(jì)算機(jī)視覺(jué)庫(kù) OpenCVOpenC...
摘要:理論前面講的角點(diǎn)檢測(cè)器中的角點(diǎn)在旋轉(zhuǎn)的圖像中也是角點(diǎn),但是縮放呢如果縮放圖像,則角可能不是角例如,檢查下面的簡(jiǎn)單圖像,當(dāng)在同一窗口中放大時(shí),小窗口內(nèi)的小圖像中的角是平坦的所以角點(diǎn)檢測(cè)器不是尺度不變的所以,在年,不列顛哥倫比亞大學(xué)的在他的論 Introduction to SIFT (Scale-Invariant Feature Transform) 理論 前面講的Harris角點(diǎn)檢...
閱讀 1414·2021-11-25 09:43
閱讀 2271·2021-09-27 13:36
閱讀 1124·2021-09-04 16:40
閱讀 1964·2019-08-30 11:12
閱讀 3320·2019-08-29 14:14
閱讀 575·2019-08-28 17:56
閱讀 1335·2019-08-26 13:50
閱讀 1257·2019-08-26 13:29