我使用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.9s。因此,多处理并不快。为什么会这样呢?我究竟做错了什么?多处理必须更快还是?
3。)我在做什么错了,我该如何加快处理速度,以便始终尽可能快地从相机中获取图片。
谢谢您的回答。 :)
答案 0 :(得分:0)
有趣的代码。
您正在使用的队列将被任何访问阻止。这意味着如果两个进程尝试同时访问它,即使您避免了锁定,它们也会阻塞(较慢的代码)。 您应该寻找使用套接字的托管队列
FrameProcessor.py没有做任何事情。也许您可以考虑使用openCV。它已经被编译,因此速度更快(在PI上花了些记号才能使其正常运行,但值得)