如何在Python-OpenCV中读取视频帧数?遇返回-1问题如何解决?
问题解析与解决方案
嘿,这个问题其实是因为你对实时摄像头流和本地视频文件的属性理解有偏差,我来帮你拆解清楚:
为什么返回-1?
你用cv2.VideoCapture(-1)打开的是本地实时摄像头,而不是本地视频文件。对于实时摄像头流来说,它没有固定的总帧数,也不存在“当前帧位置”这个概念——因为摄像头是持续生成新帧的,没有预存的帧序列可以定位。所以当你调用cam.get(cv2.CAP_PROP_POS_FRAMES)时,OpenCV会返回-1,表示这个属性对当前的视频捕获对象无效。
针对不同场景的解决办法
场景1:获取本地视频文件的帧数
如果你是想读取本地视频文件的帧数,把-1换成视频文件的路径即可,然后用对应的属性获取:
import cv2 # 替换成你的视频文件路径 cam = cv2.VideoCapture("your_video_file.mp4") # 检查视频是否成功打开 if not cam.isOpened(): print("无法打开视频文件") exit() # 获取总帧数 total_frames = cam.get(cv2.CAP_PROP_FRAME_COUNT) print(f"视频总帧数: {total_frames}") # 读取过程中获取当前帧位置 while cam.isOpened(): ret, frame = cam.read() if not ret: break current_frame = cam.get(cv2.CAP_PROP_POS_FRAMES) print(f"当前播放到第 {current_frame} 帧") # 按q键退出 if cv2.waitKey(25) & 0xFF == ord('q'): break cam.release() cv2.destroyAllWindows()
场景2:对实时摄像头流计数帧数
如果是要统计摄像头拍摄的帧数,因为是实时流,需要自己手动维护一个计数器:
import cv2 cam = cv2.VideoCapture(-1) # 检查摄像头是否成功打开 if not cam.isOpened(): print("无法打开摄像头") exit() frame_counter = 0 while True: ret, frame = cam.read() if not ret: print("无法获取帧,退出") break frame_counter += 1 print(f"已捕获 {frame_counter} 帧") # 显示画面,按q键退出 cv2.imshow("Camera Feed", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cam.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者santosh ghimire
相关产品推荐
相关产品推荐

