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

OpenCV执行cv2.imwrite报断言错误已排除文件名问题求助

问题定位与解决方案

1 核心报错(imwrite断言失败)原因

错误触发的直接原因是frametosave为空,OpenCV不允许写入空图像。导致问题的根因有三个:

  • 代码存在缩进错误:findObjects函数定义后,boundingbox = []、classIDs = []、confidences = []这三行没有缩进进函数内部,属于全局变量,每帧的检测结果会不断累积到列表中,运行到一定帧数后会出现大量无效bbox坐标。
  • 裁剪坐标越界:你仅判断了目标区域落在指定筛选范围,但没有校验边界坐标是否超出原图像范围,当YOLO输出的bbox靠近画面边缘时,x/y可能为负,或x+w/y+h超过原图像宽高,OpenCV裁剪越界区域会返回空矩阵。
  • 未提前创建frames存储目录,路径不存在也会导致写入失败;且每帧都重置number为1,后帧写入的图片会覆盖前帧的同名文件,极端情况会出现写入冲突。

2 次要警告(视频编码不匹配)原因

你指定的MJPG编码和.mp4容器格式不兼容,FFMPEG自动 fallback 为mp4v编码,虽然不影响运行但会抛出警告。

3 具体修改方案

3.1 新增目录创建逻辑

在代码开头导入os模块,提前创建存储目录:

import cv2
import numpy as np
import os # 新增导入

os.makedirs("frames", exist_ok=True) # 新增:自动创建frames目录,已存在则不报错

3.2 修正缩进与裁剪保存逻辑

首先修复findObjects函数的缩进问题,再补充坐标合法性校验、空图判断逻辑,同时修改文件名避免覆盖:

def findObjects(output, img, framenumber):
    h, w, c = img.shape
    # 修正缩进:三个列表初始化放到函数内部,每帧清空
    boundingbox = []
    classIDs = []
    confidences = []

    for out in output:
        for det in out:
            scores = det[5:]
            classID = np.argmax(scores)
            confidence = scores[classID]
            if confidence> 0.6:
                width,height= int(det[2]*w), int(det[3]*h)
                x,y = int((det[0]*w )-width/2), int((det[1]*h) -height/2)
                boundingbox.append([x,y, width, height])
                classIDs.append(classID)
                confidences.append(confidence)

    indices = cv2.dnn.NMSBoxes(boundingbox, confidences, 0.6, 0.3)
    number = 1
    for i in indices:
        box = boundingbox[i]
        x,y,w_box,h_box = box[0],box[1],box[2],box[3]
        if(y+h_box>1000 and x+(w_box/2) <1000 ):
            # 新增:坐标合法性修正,避免越界
            x1 = max(0, x)
            y1 = max(0, y)
            x2 = min(img.shape[1], x + w_box)
            y2 = min(img.shape[0], y + h_box)
            frametosave = img[y1:y2, x1:x2]
            # 新增:判断裁剪结果非空才写入
            if frametosave.size > 0:
                # 文件名加入帧号,避免覆盖
                cv2.imwrite(f"frames/{framenumber}_{number}.jpg", frametosave)
                number+=1
        cv2.rectangle(img,(x,y), (x+w_box, y+h_box), (255,0,255),2)
        cv2.putText(img, f'{classNames[classIDs[i]].upper()} {int(confidences[i]*100)}%', (x,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,255), 2)

同时修改调用findObjects的位置,传入当前帧号:

findObjects(outputs, img, framenumber)

3.3 修复视频编码参数

把VideoWriter的fourcc参数改为匹配mp4格式的编码,消除警告:

result = cv2.VideoWriter('result.mp4', cv2.VideoWriter_fourcc(*'mp4v'),10, size)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:15:06