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
相关产品推荐
相关产品推荐

