SIFT檢測方法
SIFT算法就是把圖像的特征檢測出來,通過這些特征可以在眾多的圖片中找到相應的圖片
import cv2 #讀取圖片,以1.png為例 img=cv2.imread('1.png') #檢測關鍵點並計算描述 sift=cv2.xfeatures2d.SIFT_create() #描述符是對關鍵點的描述,可用於圖片匹配 keypoints,descriptor=sift.detectAndCompute(img,None) #將關鍵點勾畫到圖片上 flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT color=(0,255,0) #參數image代表原始圖片 #參數outImage是指輸出在哪張圖片上 #參數keypoints代表圖片的關鍵點 #參數flags代表關鍵點的勾畫方式 #參數color代表勾畫的色彩模式 img=cv2.drawKeypoints(image=img,outImage=img,keypoints=keypoints,flags=flags,color=color) #顯示圖片 cv2.imshow('sift_keypoints',img) cv2.waitKey()
將上圖處理過后,就變為了如下所示
下面圖像特征檢測選擇SIFT算法,圖像匹配算法選擇FLANN算法,:
用此圖像2.png與下圖1.png進行匹配
import cv2 img1=cv2.imread('1.png') img2=cv2.imread('2.png') #使用SIFT算法獲取圖像特征的關鍵點和描述符 sift=cv2.xfeatures2d.SIFT_create() kp1,des1=sift.detectAndCompute(img1,None) kp2,des2=sift.detectAndCompute(img2,None) #定義FLANN匹配器 indexParams=dict(algorithm=0,trees=10) searchParams=dict(checks=50) flann=cv2.FlannBasedMatcher(indexParams,searchParams) #使用KNN算法實現圖像匹配,並對匹配結果排序 matches=flann.knnMatch(des1,des2,k=2) matches=sorted(matches,key=lambda x:x[0].distance) #去除錯誤匹配,0.5是系數,系數大小不同,匹配的結果頁不同 goodMatches=[] for m,n in matches: if m.distance<0.5*n.distance: goodMatches.append(m) #獲取某個點的坐標位置 #index是獲取匹配結果的中位數 index=int(len(goodMatches)/2) #queryIdx是目標圖像的描述符索引 x,y=kp1[goodMatches[index].queryIdx].pt #將坐標位置勾畫在2.png圖片上,並顯示 cv2.rectangle(img1,(int(x),int(y)),int(x)+5,int(y)+5),(0,255,0),2) cv2.imshow('baofeng',img1) cv2.waitKey()
匹配完畢,迷你特工隊封面圖上紅色的特工下巴那里出現了一個綠點,若無法匹配則會報錯