[python opencv 计算机视觉零基础到实战] 十一 找到图片中指定内容

1_bit 2021-01-03 01:24:13 5427

一、学习目标

  1. 了解图片内容定位方法matchTemplate使用
  2. 了解minMaxLoc方法使用

目录

[python opencv 计算机视觉零基础到实战] 一、opencv的helloworld

[python opencv 计算机视觉零基础到实战] 二、 opencv文件格式与摄像头读取

[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑

[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及转换

[python opencv 计算机视觉零基础到实战] 五、对象追踪

[python opencv 计算机视觉零基础到实战] 六、图像运算

[python opencv 计算机视觉零基础到实战] 七、逻辑运算与应用

[python opencv 计算机视觉零基础到实战] 八、ROI泛洪填充

[python opencv 计算机视觉零基础到实战] 九、模糊

[python opencv 计算机视觉零基础到实战] 十、图片效果毛玻璃

如有错误欢迎指出~

二、了解从一张图片中找到指定内容的方法

2.1 使用matchTemplate函数对图片中的指定内容进行查找

有小伙伴可能用过一些辅助软件,帮助我们从一些游戏中找到固定像素,并且去对该像素位置进行点击,随后解放双手。今天这一节所讲解的就是与这个功能相关的内容,对图像中的指定图形元素进行查找,并且选中该元素。

我们所使用的方法是matchTemplate。matchTemplate主要是一种匹配方法,通过判断物体在一张图片中的什么位置,从而进行定位,如下图所示:
matchTemplate将会在对像素点进行匹配,匹配相似度越大,则确定该位置为目标。这个方法有一定局限性,在原图中若目标图片发生了旋转等变化,那么将会查找失败。

matchTemplate有几种匹配算法,分别是TM_SQDIFF平方差匹配、TM_CCORR相关性匹配以及TM_CCOEFF相关性系数匹配。TM_SQDIFF平方差匹配是平方差匹配,最佳匹配值为0,若不佳则匹配值会越大;TM_CCORR是由原图和目标图像做乘法,值越高匹配越佳,反之越差,0为最差;TM_CCOEFF是将模版对其均值相对值与图像对其均值相关值进行匹配,最佳匹配为1,0表示完全匹配不到,-1则表示有匹配,但是精确度不高。以上内容了解即可,对于初学者来说就知道就行,不理解也不妨碍我们现阶段使用该API进行开发。
matchTemplate函数原型为:

matchTemplate(img, tpl, method[, result[, mask]])

matchTemplate中参数img为目标图像,tpl为原图,method是所使用的匹配算法,result是匹配结果图像。
我们首先引入所需库:

import cv2
import numpy as np

target = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
tpl = cv2.imread(r'C:\Users\mx\Desktop\1target.png')

以上代码中引入了目标图片target与原图tpl。随后我们使用TM_SQDIFF_NORMED匹配方法对图像进行匹配。
接下来获取目标图片的宽高:

th, tw = tpl.shape[:2]

目标图片如下:

随后传入参数至matchTemplate方法中:

result = cv2.matchTemplate(target, tpl, cv2.TM_SQDIFF_NORMED)

接下来我们需要使用一个方法minMaxLoc。minMaxLoc方法是在一个矩阵中寻找最大值和最小值,并且得到最大值最小值的索引。若有一个矩阵为[[1,2,3,4],[5,11,7,8]],名为a,传入到 方法后,代码如下:

min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(a)
print(min_val,max_val,min_loc,max_loc)

最终结果将是:

1.0 11.0 (0, 0) (1, 1)

我们接下来使用minMaxLoc获取matchTemplate算出来的计算结果,由于我们使用的方法是TM_SQDIFF_NORMED,那么将获取最低值进行目标获取。代码如下:

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
tl = min_loc

接下来我们使用rectangle对所需要的部分进行绘图。rectangle接收五个参数,分别是image图片、start_point起始坐标、end_point结束坐标、color颜色、thickness线条粗细。我们就常规使用前4个参数就ok了。
接下来我们使用最小的坐标加上目标图片的宽高就可以知道绘制区域了:

br = (tl[0] + tw, tl[1] + th)

最终完整的代码如下:

import cv2
import numpy as np

target = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
tpl = cv2.imread(r'C:\Users\mx\Desktop\1target.png')
th, tw = tpl.shape[:2]

result = cv2.matchTemplate(target, tpl, cv2.TM_SQDIFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
tl = min_loc
br = (tl[0] + tw, tl[1] + th)
cv2.rectangle(target, tl, br, [0, 255, 0])
cv2.imshow("target", target)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

2.2 深入了解matchTemplate函数

matchTemplate函数的查找方式我们可以通过matchTemplate函数所返回的结果进行查看,修改代码如下:

import cv2
import numpy as np

target = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
tpl = cv2.imread(r'C:\Users\mx\Desktop\1target.png')
methods = [cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF_NORMED]
th, tw = tpl.shape[:2]

result = cv2.matchTemplate(target, tpl, cv2.TM_SQDIFF_NORMED)

cv2.imshow("result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()

我们以上代码直接显示了result结果,由于为了演示效果,最理想状态是扣选出来的图片,所以我使用了原图进行目标图像的选取。

tpl=target[200:400,280:450]

并且使用了methods列表存储了匹配方法TM_SQDIFF_NORMED、TM_CCORR_NORMED、TM_CCOEFF_NORMED。之后使用了遍历依次使用这些方法对目标图片进行匹配。但是由于不同的方法高地值表示不懂的匹配效果,在此使用了if语句判断不同的方法取不同的高低值:

if md == cv2.TM_SQDIFF_NORMED:
        tl = min_loc
    else:
        tl = max_loc

修改了目标图,为了有更好的对比,目标图如下:

结果如下:

以上我展示了一种方法的结果图,其它方法由于我选择的目标图有太多相似的区域,所以这张图是一种较为理想的想过。可以看到在黄色箭头选择的区域有明显的高亮位置,该位置则是我们进行目标匹配后的结果位置。其实在进行匹配时,这个过程就类似于是卷积。

三、总结

  1. 目标匹配方法matchTemplate的使用方法
  2. 了解了matchTemplate方法有3中匹配方式,依次是TM_SQDIFF_NORMED、TM_CCORR_NORMED、TM_CCOEFF_NORMED
  3. 了解了不同匹配方法之间高低值有不同的依据结果
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
1_bit
红包 99 9 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
1_bit
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区