【opencv】利用opencv进行图像识别与定位

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()

匹配完毕,迷你特工队封面图上红色的特工下巴那里出现了一个绿点,若无法匹配则会报错

 

posted @ 2019-08-13 19:14  只宅不技术  阅读(34854)  评论(3编辑  收藏  举报