#对象查找
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread(r'C:\Users\Administrator\Desktop\project\\nail_cut.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
img2=cv2.imread(r'C:\Users\Administrator\Desktop\project\\nail_2.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
orb=cv2.ORB_create()#创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)#检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)#检测关键点和计算描述符
bf=cv2.BFMatcher_create(cv2.NORM_HAMMING,crossCheck=True)#创建匹配器
ms=bf.match(des1,des2)#执行特征匹配
ms=sorted(ms,key=lambda x:x.distance)#按距离排序
matchesMask=None
if len(ms)>10:#在有足够数量的匹配结果后,才计算查询在训练图像中的位置
#计算查询图像匹配结果的坐标
querypts=np.float32([kp1[m.queryIdx].pt for m in ms]).reshape(-1,1,2)
#计算训练图像匹配结果的坐标
trainpts = np.float32([kp1[m.queryIdx].pt for m in ms]).reshape(-1, 1, 2)
#执行查询图像和训练图像的透视变换
retv,mask=cv2.findHomography(querypts,trainpts,cv2.RANSAC)
#计算最佳匹配结果的掩模,用于绘制匹配结果
matchesMask=mask.ravel().tolist()
h,w=img1.shape
pts=np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)
#执行向量的透视矩阵变换,获得查询图像在图像中的位置
dst=cv2.perspectiveTransform(pts,retv)
#用白色矩形在训练图像中绘制出查询图像的范围
img2=cv2.polylines(img2,[np.int32(dst)],True,(255,255,255),5)
img3=cv2.drawMatches(img1,kp1,img2,kp2,ms,None,
matchColor=(0,255,0),
singlePointColor=None,
matchesMask=matchesMask,
flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.axis('off')
plt.show()