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

Python调用OpenCV matchTemplate模板匹配报(-215:Assertion failed)错误如何解决

OpenCV实时截图模板匹配报错解决方案

报错cv2.error: (-215:Assertion failed) corr.rows <= img.rows + templ.rows - 1 && corr.cols <= img.cols + templ.cols - 1的核心原因是模板图像尺寸异常,或模板尺寸大于待匹配的截图尺寸,由代码中两处逻辑错误直接导致:

  • 第一处:模板读取逻辑错误
    loadImages函数已经将所有模板图像读取并存入image_list数组,但matchTemplate循环中错误执行needle_img = cv.imread(str(image_list), cv.IMREAD_UNCHANGED):str(image_list)是将Python列表转为字符串,不是有效图片路径,读取到的needle_img为None,无法通过匹配前的尺寸校验,直接触发报错。
  • 第二处:函数调用逻辑错误
    代码末尾既调用了loadImages()(内部已经触发matchTemplate(image_list)执行),又额外调用无参数的matchTemplate(),即便修复第一处错误,也会因入参缺失抛出异常。
  • 附加优化点:PIL的ImageGrab返回的是RGB格式图像,原有代码用cv.COLOR_BGR2GRAY转灰度会出现色彩偏差,建议替换为cv.COLOR_RGB2GRAY提升匹配精度。

修复后代码

import cv2 as cv
import glob
import numpy as np
from PIL import ImageGrab

def loadImages():
    image_list = []
    # 替换为你的模板图片实际存放路径
    directory = glob.glob(r"C:\Users\*.png")
    for img_path in directory:
        ship_img = cv.imread(img_path, 0)
        # 增加异常校验,避免损坏图片导致后续匹配出错
        if ship_img is not None:
            image_list.append(ship_img)
    return image_list

def matchTemplate(image_list):
    while True:
        haystack_img = ImageGrab.grab()
        haystack_img_np = np.array(haystack_img)
        haystack = cv.cvtColor(haystack_img_np, cv.COLOR_RGB2GRAY)
        
        for needle_img in image_list:
            # 直接使用预读取的模板图像,无需重复读取
            result = cv.matchTemplate(haystack, needle_img, cv.TM_CCOEFF_NORMED)
            min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
            # 匹配阈值可根据实际效果调整,0.8为通用参考值
            if max_val > 0.8:
                h, w = needle_img.shape[:2]
                top_left = max_loc
                bottom_right = (top_left[0] + w, top_left[1] + h)
                cv.rectangle(haystack, top_left, bottom_right, 255, 2)
        
        cv.imshow('Result', haystack)
        if cv.waitKey(1) == 27:
            break
    cv.destroyAllWindows()

# 正确调用逻辑
image_list = loadImages()
matchTemplate(image_list)

静态测试代码可正常运行的原因

静态测试代码中直接使用循环遍历得到的预读取模板图像参与匹配,没有执行错误的重复读取逻辑,因此不会触发尺寸校验异常。


内容的提问来源于stack exchange,提问作者user9686961

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:57:03