我正在尝试从本地摄像头(raspberry pi摄像头,但也可以是我笔记本电脑的摄像头)发送帧到Google cloud实例,在该实例上我正在运行帧的AI处理。
我正在设法通过http (即tcp??)发送通过opencv捕获的帧。并在flask服务器上接收它们。当flask服务器在本地运行时,我可以获得良好的fps (图像大小为640x480的50+ fps ),但是一旦我将帧发送到google实例上的flask应用程序,fps就会急剧下降到~5fps。
我当前如何发送帧:
while True:
frame = vs.read() #Separate thread, using cv2 to get the frame
ret, jpeg = cv2.imencode('.jpg', frame)
imgdata = jpeg.tobytes()
response = requests.post(
url='http://<IP address of google instance>:<port>',
data= imgdata,
headers={'content-type':'image/jpeg'},
)我看到了两个问题:1-使用tcp意味着我比udp协议慢,但是udp在字节大小上是有限制的。如果我错了,请纠正我,但发送截断的帧并将它们放回服务器上似乎非常复杂。2-即使我有udp工作,也没有帧压缩,所以我永远不会达到有效的传输
我希望答案类似于使用ffmpeg,但到目前为止,我只知道如何使用ffmpeg在本地端口上流式传输帧,我不知道是否可以将帧发送到远程服务器。
对最好的前进方式有什么建议吗?
发布于 2019-04-27 17:33:57
对于您的情况,正确选择的协议是TCP。UDP不保证数据以正确的顺序到达并且完好无损。在您的情况下,UDP不会比TCP更快(如果您要确保代码中的数据是完整的和有序的)。
您已经通过将图像转换为jpg来压缩图像。额外的压缩将是非常低效的。TCP和UDP都不会在传输中压缩数据。
我相信现在您受到requests库和将数据编码成HTTP协议的限制。您应该考虑使用纯TCP,而不是HTTP的开销。这可以通过标准python库中的socket模块来完成。然而,您可能仍然会有较低的性能,因为您没有帧间压缩,而只使用帧内压缩。您需要考虑使用ffmpeg来压缩来自摄像机的数据,并使用程序或使用ffmpeg's point 2 point streaming通过TCP发送流。
https://stackoverflow.com/questions/55878521
复制相似问题