OpenCV可正确统计视频帧数但读取帧为零矩阵,如何排查代码问题?
问题原因与修复方案
核心原因
cv2.VideoCapture的read()方法为了提升读取效率,默认会复用同一块内存空间存储读取到的帧数据。你在循环中直接把frame append到frame_list时,实际存入的是指向同一块内存的引用,并不是当前帧的独立拷贝。
当循环结束、调用cap.release()释放视频读取器后,这块被复用的内存会被回收/重置,最终你查看frame_list时所有引用指向的内存内容都变成了零矩阵。
你调用cv2.imshow能正常显示帧,是因为imshow会在调用瞬间拷贝帧数据用于渲染,不会受后续内存变更的影响。
修复方法
只需要在把帧存入列表时,对frame做一次深拷贝即可,修改对应代码行:
# 原有代码 frame_list.append(frame) # 修改为以下任意一种写法即可 frame_list.append(frame.copy()) # 或者使用numpy拷贝 import numpy as np frame_list.append(np.copy(frame))
其他可选排查点
如果修改后问题仍存在,可以逐一排查以下情况:
- 检查导入的库是否存在冲突,比如是否同时导入了其他版本的OpenCV或者图像处理库覆盖了cv2的实现
- 确认是否有后续代码批量修改了
frame_list中所有数组的数值
内容的提问来源于stack exchange,提问作者deniyorum
相关产品推荐
相关产品推荐

