如下圖為進行測試的q和h,分別驗證基於BFmatcher、FlannBasedMatcher等的SIFT算法


代碼如下:
import numpy as np import cv2 from matplotlib import pyplot as plt imgname1 = 'G:/q.jpg' imgname2 = 'G:/h.jpg' sift=cv2.xfeatures2d.SIFT_create() img1 = cv2.imread(imgname1) gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度處理圖像 kp1, des1 = sift.detectAndCompute(img1,None) #des是描述子 img2 = cv2.imread(imgname2) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)#灰度處理圖像 kp2, des2 = sift.detectAndCompute(img2,None) #des是描述子 #hmerge = np.hstack((gray1, gray2)) #水平拼接 #cv2.imshow("gray", hmerge) #拼接顯示為gray #cv2.waitKey(0) #img3 = cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255)) #畫出特征點,並顯示為紅色圓圈 #img4 = cv2.drawKeypoints(img2,kp2,img2,color=(255,0,255)) #畫出特征點,並顯示為紅色圓圈 #hmerge = np.hstack((img3, img4)) #水平拼接 #cv2.imshow("point", hmerge) #拼接顯示為gray #cv2.waitKey(0) # BFMatcher解決匹配 bf = cv2.BFMatcher() matches = bf.knnMatch(des1,des2, k=2) # 調整ratio good = [] for m,n in matches: if m.distance < 0.75*n.distance: good.append([m]) img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) cv2.imshow("BFmatch", img5) cv2.waitKey(0) cv2.destroyAllWindows()
效果如下:

