PiCamera + RaspberryPi:尽管多处理速度太慢,仍能捕获帧?

时间:2019-04-25 13:06:09

标签: python opencv image-processing raspberry-pi multiprocessing

我使用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(使用者):

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.9s。因此,多处理并不快。为什么会这样呢?我究竟做错了什么?多处理必须更快还是?

3。)我在做什么错了,我该如何加快处理速度,以便始终尽可能快地从相机中获取图片。

谢谢您的回答。 :)

1 个答案:

答案 0 :(得分:0)

有趣的代码。

您正在使用的队列将被任何访问阻止。这意味着如果两个进程尝试同时访问它,即使您避免了锁定,它们也会阻塞(较慢的代码)。 您应该寻找使用套接字的托管队列

FrameProcessor.py没有做任何事情。也许您可以考虑使用openCV。它已经被编译,因此速度更快(在PI上花了些记号才能使其正常运行,但值得)