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

