前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python之OpenCV库15行代码进行图像匹配定位

Python之OpenCV库15行代码进行图像匹配定位

原创
作者头像
言志志
发布2023-10-18 19:50:46
1.1K1
发布2023-10-18 19:50:46
举报

前言

本文仅为个人学习使用,使用python中的opencv库进行图像模板匹配,如有不对,还望指正

opencv进行图像匹配

第一步,导入相关的包

如果没有的话,请在终端执行pip install opencv-python进行安装

代码语言:txt
复制
import cv2 as cv

第二步,使用opencv中的函数imread()导入图片,得到实例,这个实例其实就是一个矩阵

代码语言:txt
复制
img = cv.imread("图片路径")

第三步,我们随意将原图片进行切割,得到切割下下来的图,后面我们将使用这个切割下来的图进行模板匹配,注意,原图并未改变,此处为值传递

代码语言:txt
复制
img2 = img[100:150,100:150]

第四步,使用匹配锁定函数matchTemplate()

代码语言:txt
复制
mt =  cv.matchTemplate(img,img2,1)

解释一下这个函数,第一个参数是原图,第二个参数为匹配图,感觉有点没说清楚,就是拿img2到img上去匹配,注意img2要小于img,最后一个参数是模式选择,这个模式选择我们需要着重讲一下:

matchTemplate函数的常用可选模式有

  • cv.TM_SQDIFF_NORMED 平方差匹配法

cv.TM_SQDIFF_NORMED方法是一种匹配模板的方法,它计算目标图像和模板图像之间的差异,并返回最小差异的位置。它计算目标图像和模板图像的差的平方,并将差的平方和作为匹配结果。匹配结果越小,表示匹配程度越好。可以在传参时缩写为数字1,在上面的例子中就是写的缩写形式1。

  • cv.TM_CCORR_NORMED 相关匹配法

它计算目标图像和模板图像的像素值相关系数,并将相关系数作为匹配结果。

相关系数越大,表示匹配程度越好。 可以缩写为3。

  • cv.TM_CCOEFF_NORMED 相关系数匹配法

相关系数匹配法也是一种基于像素值相关性的匹配方法,但与相关匹配法不同,它使用的是归一化的相关系数。

归一化的相关系数在-1和1之间,表示匹配程度的相似度。

归一化相关系数越接近1,表示匹配程度越好 , 缩写为数字5。

这个函数返回的结果是还是一个矩阵,但是里面的值,根据模式的选择就不一样了

第五步,根据模式的选择,进行相关数据的提取,此处我们用minMaxLoc()函数来进行相关数据的提取。

代码语言:txt
复制
min,max,minLocation,maxlocation =  minMaxLoc(mt)  # mt为前面匹配锁定函数得到的

然后minLocation是最小值的位置,maxLocation是最大值的位置,就是都有x和y

第六步,根据得到的x和y进行相关数据的计算,方便我们在原图像上画出矩形,进行图像展示,此处主要考验思维能力。

如果是模式选择为1的话,也就是平方差匹配法,那我们应该选择最小的值,最小的地方,就是匹配度最高的,具体原因看上面的模式的介绍。

然后我们就进行相关数据的计算,我们先提取所查找区域的高度和宽度。

代码语言:txt
复制
w,h = img2.shape[:2]  

然后再最小点加上最高宽度和高度,得到的就是我们所查找的区域

代码语言:txt
复制
br = (w+minLocation[0],h+minLocation[1])

然后我们在原图形上画矩形,用的是rectangle函数,我们将所匹配到的区域,画一个矩形框起来

代码语言:txt
复制
cv.rectangle(img,minLocation,br,(0,0,255),2)

第一个参数是原图片,第二个和第三个是矩形的两点,第四个参数是矩形的宽度

然后我们再展示图片,最后面的那两个是用来指定关闭的。

代码语言:txt
复制
cv.imshow("img",img)
cv.imshow("img2",img2)


cv.waitKey(0)
cv.destroyAllWindows()

效果如下图

完整代码如下

代码语言:txt
复制
import cv2 as cv

if __name__ == '__main__':
   img = cv.imread("../images/lena-raw.jpeg")
   img2 = img[100:150,100:150]

   xishu = cv.matchTemplate(img,img2,3)
   print("xishu",xishu)
   min,max,minlocation,maxlocation = cv.minMaxLoc(xishu)
   h,w = img2.shape[:2]
   tr = (w+maxlocation[0],h+maxlocation[1])
   print("tr",tr)

   cv.rectangle(img,maxlocation,tr,(0, 0, 255),2)
   cv.imshow("img",img)
   cv.imshow("img2",img2)


   cv.waitKey(0)
   cv.destroyAllWindows()

总结

使用opencv进行图像匹配,其实最重要的就是matchTemplate函数的使用,我们需要根据匹配模式的不同,进行相关后续的操作。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • opencv进行图像匹配
  • 总结
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档