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

OpenCV提取视频帧调用imwrite报(-5:Bad argument)错误求助

错误原因

你碰到的imwrite参数类型报错,以及代码里的其他问题一共5处:

  • 核心报错原因:vidcap.read()的返回值是(读取状态, 帧图像)的二元元组,第一个值是布尔值标记是否读成功,第二个才是可以传给imwrite的图像数组。你直接把整个元组传给imwrite,类型完全不匹配,自然会抛出「期望接收UMat类型」的错误。
  • 循环条件写错:isOpened是VideoCapture的方法,必须加括号isOpened()调用才能拿到正确的布尔判断值,不写括号的话判断的是方法对象本身,永远为真,会直接死循环。
  • Python缩进错误:while块内的代码没有统一缩进,运行时会先触发语法错误。
  • Windows路径转义问题:字符串里的\是转义符,你路径里的\test.mp4里的\t会被识别成制表符,会导致OpenCV找不到目标视频文件。
  • 缺少终止判断:视频读到末尾后read会返回False,这时候如果不跳出循环,后续拿空值写文件也会报错。
修正后的完整代码
import cv2

# 路径前加r声明为原始字符串,避免转义字符导致的路径找不到问题
vidcap = cv2.VideoCapture(r"D:\danil file\KULIAH\test.mp4")
count = 0

while vidcap.isOpened():
    # 同时接收读取状态和帧图像两个返回值
    success, image = vidcap.read()
    # 读取失败(到视频末尾/帧损坏)直接退出循环
    if not success:
        break
    # 保存当前帧
    cv2.imwrite(r"D:\danil file\KULIAH\%d.png" % count, image)
    count += 1

# 执行完释放资源
vidcap.release()
cv2.destroyAllWindows()
可选优化

如果不需要逐帧提取,比如每隔N帧保存一张,可以在保存逻辑前加计数判断,比如每隔3帧存一次就写:

if count % 3 == 0:
    cv2.imwrite(r"D:\danil file\KULIAH\%d.png" % count, image)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:27:18