使用Python中的OpenCV VideoCapture获取当前帧

时间:2015-10-19 18:58:02

标签: python opencv video-capture

我正在使用cv2.VideoCapture来读取python脚本中的RTSP视频链接的帧。 .read()函数在while循环中,每秒运行一次,但是,我没有从流中获取最新的帧。我得到了较旧的框架,这样我的滞后就会增加。无论如何,我可以获得最新的帧而不是使用管道进入VideoCapture对象的旧帧吗?

2 个答案:

答案 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()