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

