Обработка изображения с помощью Open CV каждые n секунд - PullRequest
0 голосов
/ 21 мая 2018

Я пишу программу с использованием OpenCV 3.4 и Python 3. Я также использую Raspberry pi 3 и PiCamera.Моя проблема в том, что мне приходится обрабатывать последний кадр из видео, записанного в реальном времени с Picamera, каждые 2 или 3 секунды.

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(...)

У меня есть код, подобный этому.Этот код работает очень хорошо, но Raspberry продолжает обрабатывать последний кадр видео много раз за секунды.Я хочу обрабатывать только 1 раз каждые 2 или 3 секунды.Я пробовал с time.sleep (2) в цикле while, но он не работает, потому что тогда видео не в реальном времени.Я много искал в интернете и думаю, что picamera продолжает записывать, и по прошествии 2 секунд моя программа обрабатывает кадр после, а не последний кадр, записанный камерой.В интернете я нашел функцию VideoCapture.Grab, но я не понимаю, как она работает и нужно ли мне ее использовать.Я нашел этот другой вопрос, который очень похож на мой Как сделать снимок после каждых 5 секунд камеры, используя opencv python и Raspbery Pi 3? , но вторая часть кода вырезана или похожа, и яне могу понятьСпасибо всем.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вы можете вручную считать время, используя time.time().

from time import time
import cv2

# Create a new VideoCapture object
cam = cv2.VideoCapture(0)

# Initialise variables to store current time difference as well as previous time call value
previous = time()
delta = 0

# Keep looping
while True:
    # Get the current time, increase delta and update the previous variable
    current = time()
    delta += current - previous
    previous = current

    # Check if 3 (or some other value) seconds passed
    if delta > 3:
        # Operations on image
        # Reset the time counter
        delta = 0

    # Show the image and keep streaming
    _, img = cam.read()
    cv2.imshow("Frame", img)
    cv2.waitKey(1)
0 голосов
/ 21 мая 2018

Вот быстрое и простое решение:

В Python time.time() захватывает текущее время в секундах с 1 января 1970 года. Если вы просто захватываете текущее время и сравниваете его с вашим циклом 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 sleep на import time).Надеюсь, это поможет!Он не остановит вашу программу и не замедлит ее вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...