我使用OpenCV 3.1.0从ip camera HikVision DS-2CD2432F-IW(rtsp,h264)捕获实时视频流,分辨率为2048x1536,rps 20.我想缓冲几帧。有我的分析代码:
import cv2
cap = cv2.VideoCapture('rtsp://login:psw@xxx.xxx.xxx.xxx/Streaming/Channel/1')
frames = []
while cap.isOpened():
cap.grab()
img_success, img = cap.retrieve()
if img_success:
frames.append(img.copy())
frame_i += 1
if frame_i == 200:
break
问题在于调用 frames.append(img.copy())。
如果这条线被评论 - 一切都很好。
如果不是 - 有时(!) cap 对象的行为不明确。在cap.grab(),cap.retrieve()的分析结果或 cap.retrieve()执行的平均时间过长时,会显示任一帧异常值。
该功能是 frames.append(img.copy())的时间稳定且可忽略不计(1-5 ms)。同时,由于img references to memory of the cap, img.copy()似乎以某种方式影响 cap 对象的进入状态。
仅在高分辨率下发生,并非总是如此。
我的硬件:32GB RAM,Inter Core i7 x 12
有什么想法吗?