前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单应性对象查找

单应性对象查找

作者头像
裴来凡
发布2022-09-21 08:44:23
3650
发布2022-09-21 08:44:23
举报

代码语言:javascript
复制
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()

算法:单应性对象查找是获得最佳图像后,通过单应性执行查询图像和训练图像的透视变换来获得查询图像在训练图像中的位置。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图像处理与模式识别研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档