我目前正在开展一项涉及使用Raspberry Pi的小型机器人汽车的项目。为了有效地使用picamera(用于图像处理和实时网络流),我想使用YUV420格式(由picamera支持)。这允许我直接使用Y值进行图像处理,并将任何进一步的转换留给客户端。
是否可以通过Flask Response对象快速传输此数组(使用Python生成器)(如此处显示为JPEG:http://blog.miguelgrinberg.com/post/video-streaming-with-flask)?如果是这样,我知道我可以在JavaScript中将YUV数据转换为RGB,然后将其绘制到画布,但是如何一次一帧地访问YUV流?
如果还有其他更有效的解决方案(同时坚持使用Flask),我也想听听它们。使用Python生成器的Flask Response就像JPEG网络流的魅力一样。
答案 0 :(得分:0)
查看the picamera
documentation和the blog post you've linked,您可以创建一个多部分响应,其中包含从相机捕获的YUV420帧流,其代码如下:
def gen():
with picamera.PiCamera() as camera:
camera.start_preview()
# Camera warm-up time
time.sleep(2)
while True:
stream = io.BytesIO()
camera.capture(stream, 'yuv')
yield stream.getvalue()
#perhaps add a time.sleep() here to enforce a constant framerate?
然而,这并未涉及客户端。因为您想在JavaScript中使用图像数据,而不是仅仅在<img>
标记中显示它,您需要使用XMLHTTPRequest从JavaScript中获取它,而XMLHTTPRequest不支持多部分响应(特别是Firefox { {3}})。
更好的方法是使用used to and no longer does,从那时起WebSocket很容易,依次读取每个帧(每个帧都在自己的WebSocket消息中发送),并执行必要的操作图像处理。但是服务器端怎么样? open a WebSocket connection from JavaScript看起来它会起作用,然后发送帧流看起来像这样:
@sockets.route('/stream')
def stream_socket(ws):
with picamera.PiCamera() as camera:
camera.start_preview()
# Camera warm-up time
time.sleep(2)
while not ws.closed:
stream = io.BytesIO()
camera.capture(stream, 'yuv')
ws.send(stream.getvalue())
#perhaps add a time.sleep() here to enforce a constant framerate?