當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python OpenCV drawMatchesKnn()用法及代碼示例


OpenCV(開源計算機視覺)是一個免費的開源計算機視覺和機器學習算法庫,旨在幫助開發人員構建計算機視覺應用程序。它為圖像和視頻處理、對象檢測和識別、3D 重建等任務提供了廣泛的工具和函數。

OpenCV 的主要函數之一是其實時處理圖像和視頻的能力,使其成為構建需要實時執行對象跟蹤和人臉識別等任務的應用程序的重要工具。它還提供了許多machine-learning算法,可用於訓練目標檢測和分類等任務的模型。

PythonOpenCV庫中的drawMatchesKnn()函數用於繪製兩幅圖像關鍵點之間的匹配。它需要以下參數

特征檢測器是指用於檢測圖像中的關鍵點並計算其說明符的方法。有許多不同的特征檢測器可用,每種檢測器都有自己的優點和缺點。一些常見的特征檢測器包括:

每個特征檢測器都有一組不同的參數,可以調整這些參數來優化其性能。特征檢測器的選擇將取決於圖像的具體特征和關鍵點的所需屬性。

cv2.drawMatchesKnn(img1,
                   keypoints1,
                   img2,
                   keypoints2,
                   matches,
                   outImg,
                   matchColor=None,
                   singlePointColor=None,
                   matchesMask=None,
                   flags=None)
  • 圖像1圖像2是您要為其繪製匹配的兩個圖像。
  • 關鍵點1關鍵點2是在每個圖像中檢測到的關鍵點列表,由特征檢測器返回,例如SIFT或者SURF.
  • 火柴是關鍵點匹配的列表,由匹配器返回,例如FLANN或者BF匹配器.
  • 輸出圖像是一個可選的輸出圖像,將在其上繪製匹配項。如果未提供,將創建一個新圖像。
  • 匹配顏色是連接匹配關鍵點的線的顏色。如果未提供,則默認顏色為綠色。
  • 單點顏色是不屬於任何匹配的關鍵點的顏色。如果未提供,則默認顏色為藍色。
  • 匹配掩碼是一個可選掩碼,指定要繪製的匹配項。如果未提供此信息,則所有比賽都將進行平局。
  • 旗幟是控製函數行為的可選標誌。 DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS 標誌可用於從輸出圖像中排除單個關鍵點。
  • 繪製匹配Knn() 函數返回輸出圖像及其上繪製的匹配項。然後,您可以使用 imshow() 等函數顯示圖像,如示例中所示。

值得注意的是,drawMatchesKnn() 函數效率不高,對於大量匹配可能會很慢。如果您需要繪製大量火柴,您可能需要考慮使用其他方法,例如使用line()函數手動繪製火柴。

生成的圖像的外觀將取決於您傳遞給 drawMatchesKnn() 函數的特定參數,例如線條和關鍵點的顏色以及指定要繪製的匹配項的掩碼。您可以自定義圖像的外觀以滿足您的需求。

值得注意的是,drawMatchesKnn() 函數效率不高,對於大量匹配可能會很慢。如果您需要繪製大量火柴,您可能需要考慮使用其他方法,例如使用line()函數手動繪製火柴。

FLANN(近似最近鄰的快速庫)是一個用於執行快速近似最近鄰搜索的高效庫。它可用於查找大型數據集中一組查詢點的最近鄰居,當數據集太大而無法容納在內存中時,它特別有用。FLANN 其工作原理是構建一個數據結構(例如KD-tree或分層聚類樹),使其能夠快速搜索數據集並找到查詢點的最近鄰居。它返回近似最近鄰居,這意味著返回的鄰居可能不是真正的最近鄰居,但它們會接近真正的最近鄰居。

另一方麵,BFMatcher 代表暴力匹配器。這是一種簡單直接的匹配說明符的方法。它的工作原理是將一組中的每個說明符與另一組中的每個說明符進行比較,並返回具有最小歐幾裏德距離的匹配項。 BFMatcher 易於使用,並且對於小型數據集有效,但隨著數據集變大,它變得低效,因為它必須將每個說明符與其他每個說明符進行比較。這使得它不太適合需要考慮速度的大規模應用。

總之,FLANN 是一種在大型數據集中查找最近鄰的更有效方法,而 BFMatcher 是一種更簡單的方法,可用於小型數據集。

Python3


import numpy as np 
import cv2 
#from matplotlib import pyplot as plt 
  
  
# load the images 
image1 = cv2.imread('Bhagavad-Gita.jpg') 
image2 = cv2.imread('Geeta.jpg') 
  
# img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 
# img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 
  
# Initiate SIFT detector 
sift = cv2.SIFT_create() 
  
# find the keypoints and descriptors with SIFT 
keypoint1, descriptors1 = sift.detectAndCompute(image1, None) 
keypoint2, descriptors2 = sift.detectAndCompute(image2, None) 
  
# finding nearest match with KNN algorithm 
index_params = dict(algorithm=0, trees=20) 
search_params = dict(checks=150)   # or pass empty dictionary 
  
flann = cv2.FlannBasedMatcher(index_params, search_params) 
  
Matches = flann.knnMatch(descriptors1, descriptors2, k=2) 
  
# Need to draw only good matches, so create a mask 
good_matches = [[0, 0] for i in range(len(Matches))] 
  
# Good matches 
for i, (m, n) in enumerate(Matches): 
    if m.distance < 0.5*n.distance: 
        good_matches[i] = [1, 0] 
  
  
# Draw the matches using drawMatchesKnn() 
Matched = cv2.drawMatchesKnn(image1, 
                             keypoint1, 
                             image2, 
                             keypoint2, 
                             Matches, 
                             outImg=None, 
                             matchColor=(0, 155, 0), 
                             singlePointColor=(0, 255, 255), 
                             matchesMask=good_matches, 
                             flags=0
                             ) 
  
# Displaying the image  
cv2.imwrite('Match.jpg', Matched) 

輸出:

True
drawMatchKNN- Geeksforgeeks

繪製匹配KNN

該代碼首先加載兩個圖像並使用 SIFT 特征檢測器檢測關鍵點和說明符。然後,它使用 FLANN 匹配器查找最近鄰居,並使用 Lowe 比率測試過濾匹配項。最後,它使用drawMatchesKnn()函數繪製關鍵點之間的匹配並顯示結果圖像。

使用 BFMatcher

Python3


import numpy as np 
import cv2 
  
#load the images 
image1 = cv2.imread('Bhagavad-Gita.jpg')  
image2 = cv2.imread('Geeta.jpg')  
  
#img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 
#img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 
  
# Initiate SIFT detector 
sift = cv2.SIFT_create() 
  
# find the keypoints and descriptors with SIFT 
keypoint1, descriptors1 = sift.detectAndCompute(image1, None) 
keypoint2, descriptors2 = sift.detectAndCompute(image2, None) 
  
  
#Initialize the BFMatcher for matching 
BFMatch = cv2.BFMatcher() 
Matches = BFMatch.knnMatch(descriptors1,descriptors2,k=2) 
  
# Need to draw only good matches, so create a mask 
good_matches = [[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.5*n.distance: 
        good_matches[i]=[1,0] 
          
# Draw the matches using drawMatchesKnn() 
Matched = cv2.drawMatchesKnn(image1,       
                             keypoint1,    
                             image2, 
                             keypoint2, 
                             Matches, 
                             outImg = None, 
                             matchColor = (0,0,255),   
                             singlePointColor = (0,255,255), 
                             matchesMask = good_matches, 
                             flags = 0
                            ) 
  
# Save the image  
cv2.imwrite('BFMatch.jpg', Matched)

輸出

True
DrawMatchesKnn with BFMatcher -Geeksforgeeks

DrawMatchesKnn 與 BFMatcher

重要因子

有幾個因子會影響drawMatchesKnn的準確性:

  • 關鍵點和說明符的質量:匹配過程的準確性取決於用於表示圖像中特征的關鍵點和說明符的質量。如果關鍵點不明顯或者說明符不穩健,則很難找到準確的匹配。
  • 特征檢測器和說明符提取器的選擇:匹配過程的準確性可能會受到特征檢測器和說明符提取器的選擇的影響。不同的特征檢測器和說明符提取器將產生具有不同屬性的關鍵點和說明符,並且某些可能更適合所匹配圖像的特定特征。
  • 關鍵點和說明符的數量:使用的關鍵點和說明符越多,匹配過程使用的信息就越多,這可以提高匹配的準確性。然而,使用太多的關鍵點和說明符也會減慢匹配過程。
  • 圖像中存在噪聲和其他幹擾:圖像中的噪聲和其他幹擾會使找到準確的匹配變得更加困難。對圖像進行預處理以消除噪聲和幹擾,有助於提高匹配的準確性。
  • 匹配方式的選擇:不同的匹配方法(例如 FLANN 或 BFMatcher)可能具有不同的準確度級別,具體取決於圖像的具體特征和所需的匹配屬性。


相關用法


注:本文由純淨天空篩選整理自rohit2sahu大神的英文原創作品 Python OpenCV – drawMatchesKnn() Function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。