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

for循环中调用cv2.imshow()无法显示模板匹配后的裁剪结果

OpenCV模板匹配裁剪失败问题修复方案

代码存在的3个核心错误

  • 模板匹配参数传值错误:遍历模板列表的循环中,cv.matchTemplate()的第二个参数错误传入了之前循环的文件名变量myfile,应传入当前遍历的模板对象tmp
  • 裁剪区域坐标维度混淆:模板的w是宽度(对应x轴)、h是高度(对应y轴),裁剪numpy数组时第一个维度是y轴范围,第二个是x轴范围,原代码写反了w和h的位置,会导致裁剪区域错位甚至越界得到空图
  • cv.imshow()参数错误:第二个参数直接传入图像数组即可,原代码额外加了*解引用操作,会把数组拆分为多个行向量传入,不符合函数参数要求,直接导致无法正常展示图像

修复后的代码示例

import cv2 as cv

# 需提前正确读取待匹配图img_rgb、img_gray,以及模板文件列表files1
template_data = []
for myfile in files1:
    image = cv.imread(myfile,0)
    template_data.append(image)

for tmp in template_data:
    w, h = tmp.shape[::-1]
    # 修复1:第二个参数改为当前模板tmp
    result = cv.matchTemplate(img_gray, tmp, cv.TM_CCOEFF_NORMED)
    _, _, _, maxLoc = cv.minMaxLoc(result)
    topLeft = maxLoc
    bottom_right = (topLeft[0] + w , topLeft[1] + h)
    # 可选优化:三通道图像画框用(0,0,255)显示红色,原255只会显示蓝色
    cv.rectangle(img_rgb, topLeft, bottom_right, (0,0,255), 2)
    # 修复2:裁剪时y轴范围加h,x轴范围加w
    crop_img = img_rgb[maxLoc[1]:maxLoc[1]+h, maxLoc[0]:maxLoc[0]+w, :]
    # 修复3:去掉*直接传图像数组
    cv.imshow("cropped", crop_img)
    cv.waitKey(0)
# 运行结束销毁所有窗口
cv.destroyAllWindows()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:48:02