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

