如何构建TakeImage函数实现指定区域截图,完成OpenCV图像定位
实现指定区域截图的TakeImage函数,配合OpenCV完成图像定位
方案1:使用pyautogui(简单易用)
pyautogui是封装完善的GUI自动化库,截图API直观易懂,适合快速落地需求。
先安装依赖:
pip install pyautogui
实现TakeImage函数:
import pyautogui def TakeImage(Region): # Region参数格式:(左上角x坐标, 左上角y坐标, 区域宽度, 区域高度) if Region is None: # 未指定区域时截取全屏 return pyautogui.screenshot() x, y, width, height = Region # 截取指定区域 return pyautogui.screenshot(region=(x, y, width, height))
方案2:使用mss(性能更优)
mss专为屏幕截图优化,速度比pyautogui更快,适合需要高频截图的场景。
安装依赖:
pip install mss pillow
实现TakeImage函数(返回格式与pyautogui一致,兼容原LocateImage代码):
from mss import mss from PIL import Image def TakeImage(Region): with mss() as sct: if Region is None: # 截取全屏(mss中monitors[1]代表主显示器) monitor = sct.monitors[1] else: x, y, width, height = Region # mss的monitor参数格式为字典,top对应y坐标,left对应x坐标 monitor = {"top": y, "left": x, "width": width, "height": height} # 截取区域并转换为PIL Image格式 sct_img = sct.grab(monitor) return Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
优化原LocateImage函数(返回屏幕绝对坐标)
原函数返回的是目标在截图区域内的相对坐标,若需要屏幕绝对坐标,可修改返回逻辑:
import cv2 import numpy as np def LocateImage(image, Region=None, Precision=0.8): TakedImage = TakeImage(Region) img_rgb = np.array(TakedImage) img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template = cv2.imread(image, 0) # 校验目标图像是否加载成功 if template is None: raise ValueError(f"无法加载目标图像文件: {image}") res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) min_val, LocatedPrecision, min_loc, Position = cv2.minMaxLoc(res) if LocatedPrecision > Precision: # 若指定了区域,将相对坐标转换为屏幕绝对坐标 if Region is not None: return Position[0] + Region[0], Position[1] + Region[1] return Position[0], Position[1] return 0, 0
测试示例
# 调用示例:查找"target.png"在区域(100,100,800,600)内的位置 target_x, target_y = LocateImage("target.png", Region=(100, 100, 800, 600), Precision=0.9) print(f"目标图像的屏幕坐标: ({target_x}, {target_y})")
内容的提问来源于stack exchange,提问作者Collaxd
相关产品推荐
相关产品推荐

