—opencv-python的模板匹配算法Template Matching

(一)需求分析

​ 如今2021年,祖国发展进入了新征程,科技技术的发展,更是不可同日而语,自动化人工智能越来越普及,钢铁侠的贾维斯仍旧高科技,办公自动化,也是一个进步吧;扯远了,,,,。近日在使用quicker软件的时候,有一个动作叫按键精灵(之前也有一个软件叫这个),目的都一样,可以录制鼠标按键的过程,不足之处在于太依赖快捷键,并且鼠标的位置是绝对位置,也就是说只能录制一些位置固定的重复动作,并达不到灵活的录制效果,于是心生一个想法,利用python的图像识别 + 按键模拟实现这样灵活的动作效果。虽然pyautogui有一个函数也可以匹配图片,但是效果不理想,所以才提出的这个方案。

pyautogui.locateOnScreen(‘folder.png’)
在当前屏幕匹配folder.png文件。

总之:一句话,python的图像识别 + 按键模拟实现自动化办公

(二)pyautogui的使用

1.pyautogui简介

PyAutoGUI具有以下功能:

  • 移动鼠标,然后单击或在其他应用程序的窗口中键入。
  • 向应用程序发送击键(例如,填写表格)。
  • 截取屏幕截图,并给出图像(例如,按钮或复选框的图像),然后在屏幕上找到它。
  • 找到应用程序的窗口,然后移动,调整大小,最大化,最小化或关闭它(当前仅Windows)
  • 在GUI自动化脚本运行时,显示消息框供用户交互
  • 总结:就是模拟键盘鼠标的操作

官方教程: https://pyautogui.readthedocs.io/en/latest/

网络教程: https://blog.csdn.net/weixin_43430036/article/details/84650938(推荐,讲得比较详细)

(三)opencv-python的模板匹配算法Template Matching

1.模板算法简绍

官网教程 :https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html#

网络教程: https://www.jianshu.com/p/5f4bb5c78184

具体用途: 从一张大的背景图中,找到一张你想要的小图;

例子1:例如从足球比赛场(背景大图)中找到梅西(待找小图):

例子2:从一个电路版(背景大图)中找到主控芯片(待找小图)

2.算法性能测试

结论: 尽量选择干扰小的背景,匹配的图尽量的丰富,优先考虑使用cv2.TM_CCOEFF_NORMED算法。

注意:这个测试并非专业测试,结果仅仅对于桌面图标的识别的简单测试,只能参考

3.测试代码

# 导入模块 cv2匹配算法 plt 显示图片
import cv2
from matplotlib import pyplot as plt# 读入图片 big1.png是背景大图; small.png是需要寻找的小图(格式.jpg .png都行)
img = cv2.imread("big1.png",0) # 0 读入灰度图
img3 = cv2.imread("big1.png",1) # 1 读入彩色图
img2 = img.copy()
template = cv2.imread("small.png",0)
w, h = template.shape[::-1]# 6种算法的列表
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR','cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']# 依次使用算法匹配
for meth in methods:img = img2.copy()method = eval(meth)# 应用模板算法,返回一系列指标res = cv2.matchTemplate(img,template,method)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 从res中挑选最优指标# 注意 TM_SQDIFF 或者 TM_SQDIFF_NORMED 算法使用最小值为最优if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)# 显示图片cv2.rectangle(img3,top_left, bottom_right, (0,0,255), 2) # 画出矩形框plt.axis('off') # 关闭坐标img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB) # 颜色转换plt.subplot(121),plt.imshow(res,cmap = 'gray')plt.title('Matching Result'), plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(img3)plt.title('Detected Point'), plt.xticks([]), plt.yticks([])plt.suptitle(meth)plt.show()

(四)图片识别的自动化办公

(1)环境安装

python版本:python3.6

第三方库:

pip install opencv-python==4.5.1.48
pip install pillow==8.2.0
pip install pyautogui==0.9.52
pip install win32gui==221.6
pip install pywin32==300

注意:pip 安装库慢,可以设置安装源,在命令行输入(永久设置)

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pyautogui安装失败的,可以参考:http://www.bubuko.com/infodetail-2982758.html

(2)思路:

​ 通过cv2的Template Matching算法,匹配到小图在大图的位置,使用pyautogui模拟按钮操作。

(3)代码

​ 启动顺序:事先把需要操作的图标截好图,最为小图,大图不需要准备,大图利用自动全屏截图。

具体的代码请看注释,注意的功能函数就是imgAutoCick(),其他的都是调用这个函数操作。

#  导入所需要的库 cv2:匹配图片 pyautogui:控制鼠标 os 操作文件 win32gui win32con 窗体操作
import cv2
import pyautogui
import win32gui, win32con
import osdef imgAutoCick(tempFile, whatDo, debug=False):'''temFile :需要匹配的小图whatDo  :需要的操作pyautogui.moveTo(w/2, h/2)# 基本移动pyautogui.click()  # 左键单击pyautogui.doubleClick()  # 左键双击pyautogui.rightClick() # 右键单击pyautogui.middleClick() # 中键单击pyautogui.tripleClick() # 鼠标当前位置3击pyautogui.scroll(10) # 滚轮往上滚10, 注意方向, 负值往下滑更多详情:https://blog.csdn.net/weixin_43430036/article/details/84650938debug   :是否开启显示调试窗口'''# 读取屏幕,并保存到本地pyautogui.screenshot('big.png')# 读入背景图片gray = cv2.imread("big.png",0)# 读入需要查找的图片img_template = cv2.imread(tempFile,0)# 得到图片的高和宽w, h = img_template.shape[::-1]# 模板匹配操作res = cv2.matchTemplate(gray,img_template,cv2.TM_SQDIFF)# 得到最大和最小值得位置min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)top = min_loc[0]left = min_loc[1]x = [top, left, w, h]top_left = min_loc #左上角的位置bottom_right = (top_left[0] + w, top_left[1] + h) #右下角的位# 先移动再操作, 进行点击动作,可以修改为其他动作pyautogui.moveTo(top+h/2, left+w/2)whatDo(x)if debug:# 读取原图img = cv2.imread("big.png",1)# 在原图上画矩形cv2.rectangle(img,top_left, bottom_right, (0,0,255), 2)# 调试显示img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)cv2.imshow("processed",img)cv2.waitKey(0)# 销毁所有窗口cv2.destroyAllWindows()os.remove("big.png")def simple_example_baidu():'''这是一个例子---百度搜索图片 需要先准备好图片,截图就可以''' # 调用函数-- 打开浏览器time.sleep(1)imgAutoCick("baidu_tu/test2.png", pyautogui.click)# 点击搜索框 百度搜图片time.sleep(2)imgAutoCick("baidu_tu/test3.png", pyautogui.click)# 输入内容time.sleep(1)pyautogui.typewrite("meinv1") #键盘输入# 点击搜索按钮time.sleep(1)imgAutoCick("baidu_tu/test4.png", pyautogui.click)# 点击图片按钮time.sleep(1)imgAutoCick("baidu_tu/test5.png", pyautogui.click)# 将鼠标移动到中间m, n = pyautogui.size()pyautogui.moveTo(x=m/2, y=n/2)# 将鼠标滚动for i in range(100):time.sleep(0.5)pyautogui.scroll(-120) # 滚轮往上滚10if __name__=="__main__":# 将代码窗口最小化Minimize = win32gui.GetForegroundWindow()win32gui.ShowWindow(Minimize, win32con.SW_MINIMIZE)#simple_example_baidu()#pyautogui.alert(text='下面即将打开开始菜单', title='提示')pyautogui.PAUSE = 1pyautogui.press('winleft')pyautogui.PAUSE = 1imgAutoCick("baidu_tu/step1.png", pyautogui.click,True)

(五)不足之处:

​ 1.存在一个大问题,就是背景图改变之后,背景里的小图和需要匹配的小图,两者的尺寸不一致,导致框出来的位置不准确。但是取了中间点也就问题不是很多,再出问题的画,下次再解决。
2.pyautogui中文输入问题

提高pyautogui识图率的优化方案相关推荐

  1. ckks方案优化最好的_站群如何优化才能提高SEO效果?站群优化方案有哪些?

    在竞争激烈的市场环境中,很多企业为了能够"崭露头角",总是想尽方法让自己的网站处在较前的位置,获得更多曝光的机会.然而,互联网的竞争大,能取胜的手段也是各式各样的,如站群优化是大多 ...

  2. 秒开率达90%:腾讯看点客户端 GIF 转视频优化方案

    导语 |众所周知,在动图场景中, GIF 一直是应用得最广泛的技术,然而 GIF 文件体积太大的劣势,导致了一些诸如客户端 GIF 加载慢.服务器占用带宽大等问题.那么,在 GIF 占比如此高的今天, ...

  3. 淘宝运营 动销率 售罄率两者区别 以及优化方案

    今天就来和大家聊聊店铺数据中和指数含义比较相似的两个数据:动销率和售罄率 . 首先就是要从定义上把他们区分开来: 一.定义 1.动销率定义 动销率是店铺有销售的商品的品种数与本店经营商品总品种数的比率 ...

  4. python Opencv和pyautogui实现自动识图点击

    python Opencv和pyautogui实现自动识图点击 1.导入python及其他模块 匹配类是上一章博客内容,pyautogui自带的图片匹配效果不是很理想.就使用Opencv的图片匹配来实 ...

  5. 如何提高百度搜索结果出图率

    一.展现样式: 二.出图改造步骤 第一步:进入搜索资源平台-->站点资源管理-->搜索结果出图. 第二步:添加JSON-LD代码,代码示例如下: <script type=" ...

  6. vivo分屏_智慧识图+智慧投屏,vivo多项功能轻松提高宅家工作效率

    在最近这个特殊时期里,为了自身和家人的安全,很多朋友都已经在家里呆了有一个月的时间了.在家时间长了,很多人都表示这样的日子真的是太枯燥了,每天在家里都是重复着吃饭.睡觉.看剧和打游戏的生活.其实要让宅 ...

  7. 大型网站压力测试及优化方案

    作者:邴越 来自:cnblogs.com/binyue 0 木桶理论应用在系统优化中 木桶理论又称短板理论,其核心思想是一只木桶盛水多少,并不取决于最高的木板,而取决于最短的那块木板. 木桶原理应用在 ...

  8. 拒绝卡顿,揭秘盒马鲜生 Android 短视频秒播优化方案

    简介:短视频作为内容重要的承载方式,是吸引用户的重点,短视频的内容与体验直接关系到用户是否愿意长时停留.因此,体验的优化就显得尤为重要.上一篇我们分享了 iOS 短视频秒播优化,这篇我们来聊聊 And ...

  9. 提升网站转化率的四步优化方案

    优化一个网站最关键和棘手的是,如何提高整体的转化率,这是任何营销策略里最重要的方面之一,而提升网站转化率是网站综合运营实力的结果.今天,我就分享一个简单有效的四步优化方案模型,可以用于建立一个成功的转 ...

最新文章

  1. 怎么获取html的某个元素,MSHTML怎么获取一个网页元素对象
  2. java的知识点运用_Java--知识点运用
  3. java多线程发牌 一个发牌 三个玩家_JAVA代码之斗地主发牌
  4. centos输入正确的账号和密码登陆不进去
  5. CodeForces - 1543D1 RPD and Rap Sheet (Easy Version)(异或+交互)
  6. rate limiter - system design
  7. Chrome如何离线安装crx文件
  8. jvm(3)-垃圾收集器与内存分配策略
  9. [机器学习笔记] Note2--单变量线性回归
  10. CentOS离线安装httpd服务
  11. python的matplotlib库怎么安装_为Python安装matplotlib库
  12. 成为一名专业的前端开发人员,需要学习什么?
  13. 互联网金融盯上房地产资金饥渴症
  14. android 回退函数,android浏览器研究-回退和前进
  15. 文具订购(【CCF】NOI Online能力测试 入门组第一题)
  16. OpenGLES.gpus_ReturnNotPermittedKillClient
  17. 解决CSDN免登陆复制问题
  18. 格拉布斯准则异常数据_异常处理准则和最佳实践
  19. 圆形插件html,jQuery简单实用的圆形进度条插件
  20. Arch-008ArchLinux安装steam

热门文章

  1. 知乎上40个有趣回复,很精辟
  2. 在php中将Unicode字符转成中文
  3. 【MySQL】逻辑库与数据表相关操作
  4. 常见的反常积分判断敛散性方法
  5. 国庆 深圳游玩 路线规划之南山区
  6. 读取groundtruth_rect.txt并转为数组
  7. 图像识别平台建设之路(自建+三方产品)
  8. 创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA的 电源接口和拨码开关、JTAG仿真器接口
  9. 2021深育杯MISC超详细WP
  10. 用jQuery--实现todolist待办事项清单