win11 python opencv作图像匹配小结

打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
近来做了一个用到python opencv的项目,安装编码都黑白常可快速的,使用中遇到一些希奇题目。
1、安装

w11下,cmd直接
  1. pip install opencv-python
复制代码
检验是否安装成功:
  1. import cv2
  2. print(cv2.__version__)
复制代码
2、截屏功能

两种写法都可以:
  1. from PIL import ImageGrab
  2. bbox = [10,120,350,450]
  3. im = ImageGrab.grab(bbox = bbox)
复制代码
  1. import pyautogui
  2. screenshot = pyautogui.screenshot(region=(x1, y1, x2 - x1, y2 - y1))
复制代码
截屏完,要转换为np.array,如:
  1. import numpy as np
  2. np.array(screenshot)
复制代码
3、图像识别接口

cv2.matchTemplate函数的语法如下:
  1. result = cv2.matchTemplate(image, templ, method[, mask])
复制代码


  • image‌:待匹配的大图像。
  • templ‌:用于匹配的模板图像。不得高出image,否则会报错。
  • method‌:匹配方法,常见的有:cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_SQDIFF、cv2.TM_SQDIFF_NORMED。
  • mask‌(可选):用于指定在源图像和模板图像上举行匹配的区域。
常见的匹配方法包罗:


  • cv2.TM_CCOEFF‌:计算相干系数。
  • cv2.TM_CCOEFF_NORMED‌:归一化相干系数。
  • cv2.TM_CCORR‌:计算相干和。
  • cv2.TM_CCORR_NORMED‌:归一化相干和。
  • cv2.TM_SQDIFF‌:计算平方差。
  • cv2.TM_SQDIFF_NORMED‌:归一化平方差。
4、封装函数

我自己封装了一个函数:
  1. def grab_and_match(template_image_file, bbox):
  2.     im = ImageGrab.grab(bbox = bbox)
  3.     im.save(r"temp.jpeg")
  4.     image = cv2.imread('temp.jpeg', cv2.IMREAD_GRAYSCALE)
  5.     item_get_template = cv2.imread(template_image_file, cv2.IMREAD_GRAYSCALE)
  6.     res = cv2.matchTemplate(image, item_get_template, cv2.TM_CCOEFF_NORMED)
  7.     min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  8.     # print(f'min_val {min_val}, max_val {max_val}, min_loc {min_loc}, max_loc {max_loc}')
  9.     return max_val >= 0.9
复制代码
写的有点挫,截屏后,先save了下,然后用cv2读出,保证与template一样得读取操纵。如果直接使用截屏得image,调用matchTemplate会出错。
后来看到别人封装的接口,感觉更通用些:
  1. def find_image_in_area(image_path, x1, y1, x2, y2, threshold=0.8):
  2.     try:
  3.         screenshot = pyautogui.screenshot(region=(x1, y1, x2 - x1, y2 - y1))
  4.         screenshot = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
  5.         screenshot_inverted = cv2.bitwise_not(screenshot)
  6.         inverted_template = invert_image_colors(image_path)
  7.         res = cv2.matchTemplate(screenshot_inverted, inverted_template, cv2.TM_CCOEFF_NORMED)
  8.         _, max_val, _, max_loc = cv2.minMaxLoc(res)
  9.         if max_val >= threshold:
  10.             h, w, _ = inverted_template.shape
  11.             center_x = max_loc[0] + w // 2 + x1
  12.             center_y = max_loc[1] + h // 2 + y1
  13.             return center_x, center_y
  14.         else:
  15.             print(f'max_val {max_val}, max_loc {max_loc}')
  16.             return None
  17.     except Exception as e:
  18.         print(f"Error: {e}")
  19.         return None
复制代码
除了举行图像匹配,还返回了匹配到的图像的中央,便于反面业务使用。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表