♥
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/xpp/Desktop/Lena.png',cv2.IMREAD_GRAYSCALE) #打开灰度图像
img2=cv2.imread('C:/Users/xpp/Desktop/Lenas.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)>100:
#计算查询图像匹配结果的坐标
querypts=np.float32([ kp1[m.queryIdx].pt for m in ms]).reshape(-1,1,2)
#计算训练图像匹配结果的坐标
trainpts=np.float32([ kp2[m.trainIdx].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)
result=cv2.drawMatches(img1,kp1,img2,kp2,ms,None,matchColor=(0,255,0),singlePointColor = None,matchesMask=matchesMask,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(result)
plt.axis('off')
plt.show()
算法:单应性对象查找是获得最佳图像后,通过单应性执行查询图像和训练图像的透视变换来获得查询图像在训练图像中的位置。
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!