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()
匹配完毕,迷你特工队封面图上红色的特工下巴那里出现了一个绿点,若无法匹配则会报错