Я использую PiCamera, RaspberyPi и RC-Car, чтобы следовать линии на земле. Мне всегда нужен текущий кадр с камеры как можно скорее, потому что RC-Car едет довольно быстро.
Поэтому я использую многопроцессорность. У меня 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.) Что я делаю не так и как я могу ускорить процесс, чтобы всегда получать максимально быстрое изображение с камеры.
Спасибо за ваш ответ. :)