首页 > 解决方案 > 每 n 秒使用 Open CV 处理一张图像

问题描述

我正在使用 OpenCV 3.4 和 Python 3 编写程序。我还使用 Raspberry pi 3 和 PiCamera。我的问题是我必须每 2 或 3 秒处理一次从 picamera 实时录制的视频的最后一帧。

import cv2
from time import sleep
cam=cv2.VideoCapture(0)
while True:
    suc, img=cam.read()
    #operation on image, it's not important
    cv2.imshow(...)

我有一个类似的代码。这段代码工作得很好,但是树莓派继续处理视频的最后一帧,持续几秒钟。我希望每 2 或 3 秒只处理 1 次。我已经尝试在 while 循环中使用 time.sleep(2) 但它不起作用,因为那时视频不是实时的。我在互联网上搜索了很多,我认为 picamera 继续记录,当 2 秒过去后,我的程序处理之后的帧,而不是相机记录的最后一帧。在互联网上,我找到了一个名为 VideoCapture.Grab 的函数,但我不明白它是如何工作的,以及是否必须使用它。我发现这个与我的非常相似的另一个问题 如何使用opencv python和Raspbery Pi 3在每5秒的相机后捕捉一张照片? 但是代码的第二部分被剪切或类似,我无法理解。谢谢你们。

标签: python-3.xopencvimage-processingraspberry-pi

解决方案


这是一个快速简便的解决方案:

在 python 中,time.time()获取自 1970 年 1 月 1 日以来的当前时间(以秒为单位)。在您的 while 循环中,如果您只是获取当前时间并将其与您上次抓取一帧的时间进行比较,那么您可以检查 2 秒是否已经过去并且然后决定像您提到的那样“保留”您的框架。您可以尝试以下代码:

import cv2
import time
cam=cv2.VideoCapture(0)
last_recorded_time = time.time() # this keeps track of the last time a frame was processed
while True:
    curr_time = time.time() # grab the current time

    # keep these three statements outside of the if statement, so we 
    #     can still display the camera/video feed in real time
    suc, img=cam.read()
    #operation on image, it's not important
    cv2.imshow(...)

    if curr_time - last_recorded_time >= 2.0: # it has been at least 2 seconds
        # NOTE: ADD SOME STATEMENTS HERE TO PROCESS YOUR IMAGE VARIABLE, img

        # IMPORTANT CODE BELOW
        last_recorded_time = curr_time

请注意,我添加了 4 行代码并将 1 ( 更改from time import sleepimport time)。我希望这有帮助!它根本不会暂停您的程序或减慢它的速度。


推荐阅读