本文主要参考: http://www.51testing.com/html/01/n-3721401.html
为理解 opencv 函数, 参考了 http://woshicver.com/
意图: 准备一张小图, 在电脑屏幕上找到小图坐标, 并点击.
1 安装 opencv 和 numpy:
pip3 install opencv-python
上述命令将 opencv 和 numpy 都安装了, 可以在类似 D:\Python36\Lib\site-packages 目录下看到
2 准备小图, 用浏览器打开 baidu.com, 用截图工具或 PrtSc 键截取百度首页的那个 "百度一下"button, 另存为 bd.PNG
3, 用程序截屏, 存为 screen.PNG, 导入两张图片, 匹配, 找到坐标, 点击.
由于还没有 PIL, 先 pip3 install PIL 结果提示: No matching distribution found for PIL
参考
先 pip3 install Pillow 提示已经安装了... ... 尴尬
为了进行鼠标点击, 安装 pyautogui
pip install -i https://pypi.douban.com/simple/ pyautogui
最终代码:
- # -*- coding: utf-8 -*-
- import pyautogui
- import cv2
- import numpy as np
- from PIL import ImageGrab
- # 截屏, 同时提前准备一张屏幕上会出现的小图 bd.PNG
- im = ImageGrab.grab()
- im.save('screen.png','png')
- # 加载原始 RGB 图像
- img_rgb = cv2.imread("screen.png")
- # 创建一个原始图像的灰度版本, 所有操作在灰度版本中处理, 然后在 RGB 图像中使用相同坐标还原
- img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
- # 加载将要搜索的图像模板
- template = cv2.imread('bd.png',0)
- # 使用 matchTemplate 对原始灰度图像和图像模板进行匹配
- res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
- # 设定阈值, 0.7 应该可以
- threshold = 0.999
- #res 大于 99.9%
- loc = np.where( res>= threshold)
- # 得到原图像中的坐标
- for pt in zip(*loc[::-1]):
- print(pt[0],pt[1])
- pyautogui.click(pt[0],pt[1])
- break
- #cv2.destroyAllWindows()
- print("the end")
注意: 测试时要把 baidu 首页的按钮显示在屏幕上.
另外代码好像还是写复杂了, 应该可以直接用 minMaxLoc 获取坐标点.
另参考: https://www.cnblogs.com/mjk961/p/9129211.html
- https://www.jianshu.com/p/c20adfa72733
- https://docs.opencv.org/master/
- https://www.cnblogs.com/chjbbs/p/5077587.html
- https://www.cnblogs.com/daysn/p/11424980.html
来源: http://www.bubuko.com/infodetail-3448126.html