最近在玩阴阳师,用 Python 脚本代肝。有两种找图思路。

两种找图都用到了 adb 的截图命令。

整体思路都是先获取到整个屏幕的截图,然后对比关键局部截图。

使用 OpenCV

import cv2


def match_img(capture_img, temp_img):
    """匹配 temp_img 是否存在 capture_img 中"""

    img1 = cv2.imread(capture_img)
    img2 = cv2.imread(temp_img)
    result = cv2.matchTemplate(img1, img2, cv2.TM_CCOEFF_NORMED)
    if result.max() > 0.9:
        return True
    return False

使用 opencv 就是读取两张图片然后对比。

使用 PIL 和 numpy

import numpy as np
from PIL import Image


def crop_screenshot(screen_path, region, file_name):
    """
    screen_path: 全屏截图的路径
    region: 需要截取关键区域的坐标 (x1, y1, x2, y2)
    file_name: 关键区域截图的文件名称
    """
    img = Image.open(screen_path)
    cropImg = img.crop(region)
    cropImg.save("img/{}.png".format(file_name))

def check_scene(self, screen_path, scene_region, scene_path):
    """
    screen_path: 全屏截图的路径
    scene_region: 需要截取关键区域的坐标 (x1, y1, x2, y2)
    scene_path: 关键区域截图的文件路径
    """
    img = Image.open(screen_path)
    crop_img = np.array(img.crop(scene_region))
    scene_asset = np.array(Image.open(scene_path))
    result = np.array_equal(scene_asset, crop_img)
    return result

使用 numpy 是使用 PIL 读取两张图片,在全屏截图中根据指定坐标截取关键区域的截图,然后使用 numpy 库的 array_equal 方法来比较新分割图片和之前已经分割好的图片的矩阵数组是否相同,相同则完成匹配。

相比来说第二种方式使用范围更广且更好用。

因为第二种方法不需要考虑截取关键区域图片的大小,对比的是 numpy 库处理后的数据,而 opencv 则是使用找图的方式对比。

最后修改:2021 年 05 月 18 日 08 : 11 PM
☕️ 小站维护不易,打赏一杯咖啡可好?