OpenCV使用VideoCapture读取视频生成3D图像栈报错如何解决
报错原因
你遇到的报错是因为OpenCV的cv2.VideoCapture类没有实现迭代器协议,不支持直接用for frame in cap的方式遍历帧。除此之外你原代码还存在两个逻辑错误:
- 用总帧数
frame_count做判断条件,该值是视频的总帧数值,不会随读取进度变化,无法实现「只取前1000帧」的需求 cap.read()返回的是(是否读取成功, 帧内容)的元组,直接用+=拼接列表会把布尔值也加入数组,不符合存储帧数据的预期
正确实现代码
import cv2 import numpy as np cap = cv2.VideoCapture('/home/jryan/Videos/RMS/20211019_234125-75mm.mkv') frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) fps = cap.get(cv2.CAP_PROP_FPS) image_array = [] current_frame = 0 max_frame = 1000 # 只取前1000帧 while cap.isOpened() and current_frame < max_frame: ret, frame = cap.read() # 读取失败直接终止循环 if not ret: break image_array.append(frame) current_frame += 1 # 释放视频资源 cap.release() # 可选:将列表转为numpy数组,得到形状为 [帧数, 高度, 宽度, 通道数] 的3D图像栈 image_stack = np.array(image_array)
关键逻辑说明
- 用
while循环配合cap.read()逐帧读取,是OpenCV官方推荐的视频帧读取方式 - 新增帧计数器
current_frame,达到设定的最大帧数后直接终止循环,也可以避免视频总帧数不足1000时出现报错 - 读取结束后必须调用
cap.release()释放视频句柄,避免残留资源占用 - 转换为numpy数组后即可直接作为3D图像栈用于后续的图像处理逻辑
内容的提问来源于stack exchange,提问作者Jimbles
相关产品推荐
相关产品推荐

