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

Python用OpenCV分割视频为图像时遇(-215)断言错误求助

问题修复方案

错误原因

你猜的没错,就是视频读完最后一帧后,代码还在强行执行后续操作导致的。当vid.read()读到视频末尾时,success会变成False,frame是空值,这时候调用cv2.imshow、cv2.imwrite这些需要有效帧的函数,就会触发那个断言错误。另外你代码里的vid.release()写在函数外面,根本不会被执行到,视频资源没法正常释放。

修复步骤

  • 每次读取帧后,先判断success是否为True,只有读到有效帧才进行显示、保存操作
  • 把waitKey的判断移到读取帧之后,避免没帧的时候还处理按键
  • 将vid.release()和窗口销毁代码放到函数内部循环结束后,确保资源正常释放
  • 灰度转换可以直接用OpenCV的cv2.cvtColor,比PIL的方式更适配OpenCV的帧格式(当然你坚持用PIL也可以,但要确保帧的颜色通道正确)

修改后的代码

import cv2
from PIL import Image
import numpy as np

def rgb_to_gray(frame):
    # 如果你用自己的rgb_to_gray函数,保留这个;如果没有,换成cv2的方式
    return np.dot(frame[...,:3], [0.2989, 0.5870, 0.1140]).astype(np.uint8)

def saveFramesUnfiltered():
    vid = cv2.VideoCapture("Maxwell Cat.mp4")
    currentFrame = 0

    while True:
        # 先读取帧
        success, frame = vid.read()
        # 没读到帧就退出循环
        if not success:
            break
        # 按键退出逻辑
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        
        # 只在读到有效帧时执行后续操作
        cv2.imshow("Output", frame)
        cv2.imwrite(f"./framesBefore/frame{currentFrame}.jpg", frame)
        
        # 两种灰度转换方式选一个就行
        # 方式1:用你自己的rgb_to_gray + PIL
        im = Image.fromarray(rgb_to_gray(frame))
        im.save(f"./framesAfter/frame{currentFrame}.jpg")
        # 方式2:直接用OpenCV转换,更方便
        # gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # cv2.imwrite(f"./framesAfter/frame{currentFrame}.jpg", gray_frame)
        
        currentFrame += 1

    # 释放资源,销毁窗口
    vid.release()
    cv2.destroyAllWindows()

# 调用函数
saveFramesUnfiltered()

额外注意点

  • 确保./framesBefore和./framesAfter这两个文件夹已经存在,不然imwrite会报错
  • 如果用OpenCV的灰度转换,记得OpenCV的帧默认是BGR格式,所以用cv2.COLOR_BGR2GRAY而不是RGB转灰度

内容的提问来源于stack exchange,提问作者MR. potato35

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:05:37