PiCamera + RaspberryPi: захватывать кадры, несмотря на слишком медленную многопроцессорную обработку? - PullRequest
0 голосов
/ 25 апреля 2019

Я использую PiCamera, RaspberyPi и RC-Car, чтобы следовать линии на земле. Мне всегда нужен текущий кадр с камеры как можно скорее, потому что RC-Car едет довольно быстро. Поэтому я использую многопроцессорность. У меня 3 процесса.

  1. Процесс: получить текущий кадр как можно скорее

  2. Процесс: для обработки текущего кадра

  3. Основной процесс: сейчас не используется.

Пока это мой код.

Main.py:

from multiprocessing import Process, Queue, Event
import VideoStream
import FrameProcessor


if __name__ == "__main__":
    queue = Queue()
    event = Event()

    process_stream = Process(target = VideoStream.stream, args = (queue, event))
    process_frame = Process(target = FrameProcessor.processFrame, args = (queue, event))

    process_stream.start()
    process_frame.start()

    process_stream.join()
    process_frame.join()

VideoStream.py (Производитель):

from picamera.array import PiRGBArray
from picamera import PiCamera
import time


def stream(queue, event):
    camera = PiCamera()
    camera.resolution = 'VGA' #(640x480)
    camera.exposure_mode = 'sports'
    camera.start_preview()
    rawCapture = PiRGBArray(camera, size=(640,480))
    time.sleep(2)

    for frame in camera.capture_continuous(rawCapture, format="rgb", use_video_port=True):
        if event.is_set():
            queue.put(frame.array)
        rawCapture.truncate(0)

FrameProcessor.py (Consumer):

import cv2
import time

def processFrame(queue, event):
    time.sleep(5)

    while True:
        start = time.time()
        event.set()
        frame = queue.get()
        event.clear()
        print("frame {}: {}".format(i,time.time() - start))
        #Do herer some imageprocessing stuff

Выход:

frame 0: 0.059038400650024414
frame 1: 0.035747528076171875
frame 2: 0.09440946578979492
frame 3: 0.03632092475891113
frame 4: 0.09602904319763184
frame 5: 0.03551483154296875
frame 6: 0.09793353080749512
frame 7: 0.0363461971282959
frame 8: 0.09468984603881836
frame 9: 0.03627347946166992
frame 10: 0.09724879264831543
frame 11: 0.034917354583740234
frame 12: 0.09811806678771973
frame 13: 0.03505754470825195
frame 14: 0.09569430351257324
...
...
...

Мои вопросы:

1.) Как видите, вывод очень необычный.

0.3s, 0.9s, 0.3s, 0.9s, 0.3s etc. ...

Я думаю, что-то не так в моем коде. Это не может быть совпадением или? Я всегда вижу 0,9 и 0,3 в своих выходах.

2.) Когда я не использую многопроцессорность, время для захвата кадра занимает около 0,9 с. Так что многопроцессорность не быстрее. Почему это так? Что я делаю неправильно? Многопроцессорность должна быть быстрее или?

3.) Что я делаю не так и как я могу ускорить процесс, чтобы всегда получать максимально быстрое изображение с камеры.

Спасибо за ваш ответ. :)

1 Ответ

0 голосов
/ 25 апреля 2019

интересный код.

Используемая вами очередь будет заблокирована любым доступом.Это означает, что если два процесса попытаются получить к нему доступ одновременно, они заблокируют (более медленный код), даже если вы избежали блокировок.Вы должны искать управляемые очереди, которые используют сокеты

FrameProcessor.py ничего не делает.Может быть, вы могли бы посмотреть на openCV для этого.Он уже скомпилирован и, следовательно, быстрее (сложно на PI, чтобы заставить его работать, но достойно)

...