OpenCV-Python sift/surf特征匹配與顯示



import cv2 import numpy as np def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch): h1, w1 = img1_gray.shape[:2] h2, w2 = img2_gray.shape[:2] vis = np.zeros((max(h1, h2), w1 + w2, 3), np.uint8) vis[:h1, :w1] = img1_gray vis[:h2, w1:w1 + w2] = img2_gray p1 = [kpp.queryIdx for kpp in goodMatch] p2 = [kpp.trainIdx for kpp in goodMatch] post1 = np.int32([kp1[pp].pt for pp in p1]) post2 = np.int32([kp2[pp].pt for pp in p2]) + (w1, 0) for (x1, y1), (x2, y2) in zip(post1, post2): cv2.line(vis, (x1, y1), (x2, y2), (0,0,255)) cv2.namedWindow("match",cv2.WINDOW_NORMAL) cv2.imshow("match", vis) img1_gray = cv2.imread("D:\\05.jpg") img2_gray = cv2.imread("D:\\06.jpg") sift = cv2.SIFT() #sift = cv2.SURF() kp1, des1 = sift.detectAndCompute(img1_gray, None) kp2, des2 = sift.detectAndCompute(img2_gray, None) # BFmatcher with default parms bf = cv2.BFMatcher(cv2.NORM_L2) matches = bf.knnMatch(des1, des2, k = 2) goodMatch = [] for m,n in matches: if m.distance < 0.50*n.distance: goodMatch.append(m) drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch[:20]) cv2.waitKey(0) cv2.destroyAllWindows()


sift特征匹配效果:




SURF特征匹配效果:




說明:
  • 1.  Sift特征和Surf特征提取特征的方法略有差異,在整個匹配流程上一樣
  • 2.  knnMatch(des1, des2,k = 2) 函數執行特征點匹配, k = 2 定義基准圖像上的一個點會在另一幅圖像上有2個匹配結果。
  • 3.  不論Sift還是Surf都是強制匹配,不能保證匹配的點就是准確的,只能保證相對正確。
  • 4.  goodMatch是經過篩選的優質配對,如果2個配對中第一匹配的距離小於第二匹配的距離的0.5,基本可以說明這個第一配對是兩幅圖像中獨特的,不重復的特征點。當然並不能保證goodMatch保留的就是最優匹配。
  • 5. OpenCV3中有drawMatchesKnn()函數,可以直接拼接顯示配對點,OpenCV2中沒有這個函數,定義的drawMatchesKnn_cv2()實現了配對顯示部分功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM