我正在使用cv2.VideoCapture来读取python脚本中的RTSP视频链接的帧。 .read()函数在while循环中,每秒运行一次,但是,我没有从流中获取最新的帧。我得到了较旧的框架,这样我的滞后就会增加。无论如何,我可以获得最新的帧而不是使用管道进入VideoCapture对象的旧帧吗?
答案 0 :(得分:0)
我和一个朋友在黑客中做同样的事情。我们不想使用所有帧。到目前为止,我们发现了同样的事情:grab()
(或读取)尝试获取所有帧,我想rtp:如果你没有足够的响应,它将保持缓冲并丢弃。< / p>
您也可以使用grab()和receive()代替读取。首先要求框架。接收将其读入内存。因此,如果您多次调用抓取,它将有效地跳过这些。
我们这样做了:
#show some initial image
while True:
cv2.grab()
if cv2.waitKey(10):
im = cv2.receive()
# process
cv2.imshow...
不是生产代码,而是......
答案 1 :(得分:0)
我遇到了同样的问题,并为他们的计算机视觉服务找到了Azure samples的git存储库。 相关部分是Camera Capture module,特别是Video Stream class。
您可以看到他们实现了一个正在更新的队列,以仅保留最新的帧:
def update(self):
try:
while True:
if self.stopped:
return
if not self.Q.full():
(grabbed, frame) = self.stream.read()
# if the `grabbed` boolean is `False`, then we have
# reached the end of the video file
if not grabbed:
self.stop()
return
self.Q.put(frame)
# Clean the queue to keep only the latest frame
while self.Q.qsize() > 1:
self.Q.get()