You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:15:36