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

一、学习目标

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

上一篇《[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 nptarget = 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 nptarget = 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 nptarget = 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_locelse:tl = max_loc

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

结果如下:

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

三、总结

  1. 目标匹配方法matchTemplate的使用方法
  2. 了解了matchTemplate方法有3中匹配方式,依次是TM_SQDIFF_NORMED、TM_CCORR_NORMED、TM_CCOEFF_NORMED
  3. 了解了不同匹配方法之间高低值有不同的依据结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linq 实现 DataTable 行转列

前几天写了一篇sqlserver 行转列,http://www.cnblogs.com/li-peng/archive/2012/02/01/2334973.html 由于工作需要,要把查出来的DataTable实现 行转列, 正好这一阵子在用Linq 就做了一个行转列的小例 子 转换前的table: 转换后的table: 代码…

Android Studio之编译提示\app\src\main\res\values\colors.xml:1:1 Error:前言有不允许的内容

1 问题 Android Studio新建立的项目运行莫名其妙提示错误如下 app\src\main\res\values\colors.xml:1:1 Error:前言有不允许的内容 然后我把res目录下面的colors.xml文件打开看如下 <?xml version"1.0" encoding"utf-8"?> <resources>&l…

Hello Playwright:(3)基本概念

下面介绍一下 Playwright 中的基本概念&#xff1a;Headless 浏览器Playwright 需要特定版本的浏览器二进制文件才能运行。这些浏览器都支持 2 种 运行模式&#xff1a;Headless&#xff0c;无浏览器 UI&#xff0c;运行速度较快&#xff0c;常用于自动化运行Headed&#xff0c…

[python opencv 计算机视觉零基础到实战] 十二 直方图

一、学习目标 了解matplotlib绘图库的使用了解如何通过折线图或者直方图对图表进行绘制了解了通过图标对图片内容进行直观判断 如有错误欢迎指出~ 二、了解图像直方图及其应用 2.1 了解matplotlib库 在了解图像直方图前我们需要了解一个matplotlib库&#xff0c;matplotli…

shell中的数字

shell中的数字 author :headsen chen date :2017-10-18 15:01:42 个人原创&#xff0c;转载请注明作者&#xff0c;出处&#xff0c;否则依法追究法律责任 1,生成随机数&#xff08;范围&#xff1a;0-32767&#xff09;&#xff0c;用特殊变量&#xff1a;RANDOM 2&#xff…

serviceloader java_【java编程】ServiceLoader使用看这一篇就够了

转载:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少听过spi&#xff0c;具体的解释我就不多说了。但是它具体是怎么实现的呢&#xff1f;它的原理是什么呢&#xff1f;下面我就围绕这两个问题来解释&#xff1a;实现: 其实具体的实现类就是java.util.ServiceLoader…

.NET7 Preview4 之OpenAPI swagger改进

在MiniAPI系列中&#xff0c;《.NET6之MiniAPI(十八)&#xff1a;OpenAPI swagger》介绍了swagger在MiniAPI框架中的使用&#xff0c;当时留下很多不足&#xff0c;随着.NET7 Preview4的推出&#xff0c;这方面得到了很大的改进&#xff0c;我还是使用“十八”这篇文章的案例。…

Swift - 自定义单元格实现微信聊天界面

1&#xff0c;下面是一个放微信聊天界面的消息展示列表&#xff0c;实现的功能有&#xff1a; &#xff08;1&#xff09;消息可以是文本消息也可以是图片消息&#xff08;2&#xff09;消息背景为气泡状图片&#xff0c;同时消息气泡可根据内容自适应大小&#xff08;3&#x…

[python opencv 计算机视觉零基础到实战] 十三 直方图颜色提鲜

一、学习目标 了解了均衡化的作用是什么了解灰度、YUV、彩色图片均衡化的方法是使用什么方法了解了合并通道的方法是什么了解了分离通道的方法是什么 如有错误欢迎指出~ 二、了解图像均衡化 2.1 了解直方图均衡化 图像直方图均衡化主要是对图像中的少数灰度进行压缩&#…

java 中字符串比较方法_java中常用的字符串的比较方法(两种)

比较字符串比较常用的两个方法是运算符“”和String的equals方法。使用“”比较两个字符串&#xff0c;是比较两个对象的的“地址”是否一致&#xff0c;本质就是判断两个变量是否指向同一个对象&#xff0c;如果是则返回true&#xff0c;否则返回的是false。而String类的equal…

分布式服务框架dubbo原理解析 转

alibaba有好几个分布式框架&#xff0c;主要有&#xff1a;进行远程调用(类似于RMI的这种远程调用)的(dubbo、hsf)&#xff0c;jms消息服务(napoli、notify)&#xff0c;KV数据库(tair)等。这个框架/工具/产品在实现的时候&#xff0c;都考虑到了容灾&#xff0c;扩展&#xff…

[python opencv 计算机视觉零基础到实战] 十五 直方图反向投影

一、学习目标 了解了直方图反向投影的一般流程了解2D直方图的使用 如有错误欢迎指出~ 二、了解直方图反向投影 2.1 了解2D直方图 需要对直方图进行反向投影&#xff0c;需要使用2D直方图。2D直方图需要使用calcHist方法。calcHist方法在前两节中已经有了解&#xff0c;现在…

关联规则java代码_重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码?...

重量挖掘关联规则挖掘方法&#xff0c;哪个大神可以将以下伪代码转换为Java代码&#xff1f; 10改进的加权关联规则算法的基本步骤与Apriori算法相似: 首先找到加权支持度不小于用户指定的最小加权支持度的所有频繁项集加权关联规则&#xff0c;然后使用频繁项集生成所有满足最…

多种语言《九九乘法表》荟萃:C、C++、C#、JavaScript、SQL、VB、VBA、Python

九九乘法表对于我们学习循环结构,尤其是双重循环特别有帮助,本文演示用C、C++、C#、HTML、SQL、VB、VBA、Python等多种语九九乘法表。 一、C语言 #include<stdio.h> main() {int i,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d\t",j,i,i*j…

[python opencv 计算机视觉零基础到实战] 十六、用opencv画画

一、学习目标 了解如何使用line方法了解如何使用rectangle方法了解如何使用ellipse方法 如有错误欢迎指出~ 二、了解OpenCV的绘图方法 2.1 了解直线绘图方法 我们在前两节中有了解使用OpenCV中的矩形绘制&#xff0c;接下来我们了解一下更多的图形绘制方法。我们在OpenCV中…

外部中断0(含知识点)

1 #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>2 #include "stm32f10x_gpio.h"3 #include "stm32f10x_exti.h"4 #include "misc.h"5 6 /*外部中断配置*/7 8 9 int main(void)10 {11 /*************…

[python opencv 计算机视觉零基础到实战] 十七、用鼠标画画

一、学习目标 了解长轴和短轴参数了解旋转角度参数了解起始角度参数了解终止角度参数 二、深入了解OpenCV的ellipse方法 2.1 纵横 椭圆的绘制方法在上一节中我们已经知道了是使用ellipse&#xff0c;ellipse的函数原型如下&#xff0c;为了清晰认识ellipse方法&#xff0c;…

Microsoft Build 2022 到来,开发者们做好准备了吗?

Microsoft Build 2022 将会在5月24日 - 5月26日正式举行&#xff0c;作为开发者的你是否和我一样期待本次的 Build&#xff0c;它会带来什么的技术革新以及黑科技呢&#xff1f;下面我就针对今年 Build 的几个主题结合相关技术来谈谈我对 Build 的期待。开发技术和相关工具今年…