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

OpenCV imshow出现(-215)断言失败错误,修改代码后窗口挂起求助

解决OpenCV imshow断言失败与窗口挂起问题

我来帮你拆解一下问题的根源,然后给出彻底的解决办法:

一、断言失败的原因

你遇到的cv2.error: (-215:Assertion failed) size.width>0 && size.height>0错误,本质是当cap.read()读取到视频末尾(或者某一帧读取失败)时,返回的frame是一个空数组——而cv2.imshow()没办法显示一个没有尺寸的空帧,自然就触发了这个断言。

看你最初的代码,有两个明显的漏洞:

cap = cv2.VideoCapture('vtest.avi')
ret, frame = cap.read()
cv2.imshow("Feed", frame)  # 这里没判断ret是否为True,第一帧读取失败直接报错
while cap.isOpened():
    ret, frame = cap.read()
    cv2.imshow("Feed", frame)  # 视频读完后frame为空,触发断言

二、窗口挂起的原因

你后来加了if ret == True的判断,虽然避免了空帧传入imshow,但窗口直接挂起,是因为OpenCV的imshow()必须配合cv2.waitKey()才能刷新GUI事件——没有waitKey的话,窗口会一直处于“无响应”状态,没办法正常渲染帧。

三、完整修复代码

下面是修复后的代码,同时解决了两个问题:

import cv2

# 初始化视频捕获对象,指定ffmpeg后端提升编码兼容性
cap = cv2.VideoCapture('vtest.avi', cv2.CAP_FFMPEG)

# 先检查视频是否成功打开
if not cap.isOpened():
    print("无法打开视频文件,请检查路径或编码兼容性")
    exit()

while cap.isOpened():
    ret, frame = cap.read()
    
    # 检查帧是否读取成功,失败则退出循环(比如到了视频末尾)
    if not ret:
        print("视频读取完毕或帧读取失败")
        break
    
    cv2.imshow("Feed", frame)
    
    # 等待1毫秒处理GUI事件,同时监听按键'q'手动退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 必须释放资源,避免内存泄漏
cap.release()
cv2.destroyAllWindows()

额外注意事项

  • 如果还是遇到视频读取问题,可能是OpenCV对视频编码的支持问题——opencv-python包默认带ffmpeg,但个别编码需要手动指定cv2.CAP_FFMPEG后端(如代码中所示);
  • 你使用的OpenCV 4.1.1属于较旧版本,可能存在一些已知的视频读取bug,建议升级到较新的稳定版;
  • 最后别忘了执行cap.release()和cv2.destroyAllWindows(),避免残留进程或窗口占用资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:46:51