摘要:匹配器匹配非常簡單,首先在第一幅圖像中選取一個關鍵點然后依次與第二幅圖像的每個關鍵點進行描述符距離測試,最后返回距離最近的關鍵點對于匹配器,首先我們必須使用創建對象。
Feature Matching
Brute-Force匹配器Brute-Force匹配非常簡單,首先在第一幅圖像中選取一個關鍵點然后依次與第二幅圖像的每個關鍵點進行(描述符)距離測試,最后返回距離最近的關鍵點.
對于BF匹配器,首先我們必須使用cv2.BFMatcher()創建BFMatcher對象。它需要兩個可選的參數.
第一個是normType,它指定要使用的距離測量,默認情況下,它是cv2.NORM_L2.它適用于SIFT,SURF等(cv2.NORM_L1也在那里).對于基于二進制字符串的描述符,如ORB,BRIEF,BRISK等,應使用cv2.NORM_HAMMING,使用漢明距離作為度量,如果ORB使用WTA_K == 3or4,則應使用cv2.NORM_HAMMING2.
crossCheck:默認值為False。如果設置為True,匹配條件就會更加嚴格,只有到A中的第i個特征點與B中的第j個特征點距離最近,并且B中的第j個特征點到A中的第i個特征點也是最近時才會返回最佳匹配,即這兩個特征點要互相匹配才行.
兩個重要的方法是BFMatcher.match()和BFMatcher.knnMatch(), 第一個返回最佳匹配, 第二種方法返回k個最佳匹配,其中k由用戶指定.
使用cv2.drawMatches()來繪制匹配的點,它會將兩幅圖像先水平排列,然后在最佳匹配的點之間繪制直線。如果前面使用的BFMatcher.knnMatch(),現在可以使用函數cv2.drawMatchsKnn為每個關鍵點和它的個最佳匹配點繪制匹配線。如果要選擇性繪制就要給函數傳入一個掩模.
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對象
matches = bf.match(des1,des2)行的結果是DMatch對象的列表。 此DMatch對象具有以下屬性:
?DMatch.distance - 描述符之間的距離。 越低越好。
?DMatch.trainIdx - 訓練描述符中描述符的索引
?DMatch.queryIdx - 查詢描述符中描述符的索引
?DMatch.imgIdx - 訓練圖像的索引
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. 它包含一組算法,這些算法針對大型數據集中的快速最近鄰搜索和高維特征進行了優化.對于大型數據集,它比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()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42073.html
摘要:理論我們知道使用向量作為描述符,由于它使用浮點數,因此基本上需要個字節,類似地,也至少需要個字節對于,為數千個特征創建這樣的向量需要大量的內存,這對于資源約束應用程序尤其是嵌入式系統是不可行的,內存越大,匹配所需的時間越長實際匹配可能不 BRIEF (Binary Robust Independent Elementary Features) 理論 我們知道SIFT使用128-dim...
摘要:為了解決這個問題,算法使用和可以通過參數來設定所以好的匹配提供的正確的估計被稱為,剩下的被稱為返回一個掩模,這個掩模確定了和點 Feature Matching + Homography to find Objects 聯合使用特征提取和 calib3d 模塊中的 findHomography 在復雜圖像中查找已知對象. 之前在一張雜亂的圖像中找到了一個對象(的某些部分)的位置.這些...
摘要:十開放模式識別項目開放模式識別項目,致力于開發出一套包含圖像處理計算機視覺自然語言處理模式識別機器學習和相關領域算法的函數庫。 一、開源生物特征識別庫 OpenBROpenBR 是一個用來從照片中識別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計算機視覺庫 OpenCVOpenC...
摘要:理論前面講的角點檢測器中的角點在旋轉的圖像中也是角點,但是縮放呢如果縮放圖像,則角可能不是角例如,檢查下面的簡單圖像,當在同一窗口中放大時,小窗口內的小圖像中的角是平坦的所以角點檢測器不是尺度不變的所以,在年,不列顛哥倫比亞大學的在他的論 Introduction to SIFT (Scale-Invariant Feature Transform) 理論 前面講的Harris角點檢...
閱讀 1405·2021-11-25 09:43
閱讀 2261·2021-09-27 13:36
閱讀 1114·2021-09-04 16:40
閱讀 1957·2019-08-30 11:12
閱讀 3309·2019-08-29 14:14
閱讀 567·2019-08-28 17:56
閱讀 1320·2019-08-26 13:50
閱讀 1246·2019-08-26 13:29