im 使用 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(消费者):
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.)我做错了什么,我怎样才能加快速度,以尽可能快地从相机中获取图片。
谢谢你的回答。:)
有趣的代码。
您正在使用的队列将被任何访问阻止。这意味着,如果两个进程尝试同时访问它,即使您避免锁定,它们也会阻止(较慢的代码)。 您应该查找使用套接字的托管队列
FrameProcessor.py 什么都没做。也许你可以看看openCV。它已经编译,因此速度更快(在 PI 上使其工作很棘手,但值得)