python - 图像处理后的视频流从服务器到 Web 客户端
问题描述
我仍然是一个初学者,我正在尝试开发一个具有面部识别功能的家庭监控应用程序,其主要思想是将图像从服务器流式传输到 Web 浏览器,包括附加数据,例如基于检测检测到/未知的人的姓名使用openCV和数据库中的其他信息,以防该人被识别,例如性别,年龄等。我做了一些有效的事情,但我不知道它的效率如何,因此我想提出一些意见。我使用烧瓶作为网络服务器和 socketio 来传输实时数据。实际的应用程序运行如下:我有一个从线程开始的函数,imageProcessing()
,它从相机中获取帧并执行所有图像处理(面部检测和识别)并将检测到的帧和人存储在一个全局变量中,分别与识别/未知的人组成数组。接下来,Web 服务器应用程序开始,在 Web 客户端和 Web 服务器之间建立连接后,人员的帧和数组连同附加信息通过 Web 套接字发送到 Web 客户端。延迟不到一秒。所以一切都在同一个应用程序上运行。所以这里的问题是:
- 在服务器应用程序中运行一个执行图像处理的线程是否有效?
- 使用全局变量是否有效且安全,以便该函数
imageProcessing()
存储来自相机的图像,然后同时使用该全局变量socket.emit()
将帧发送到 Web 客户端?
这是主应用程序的代码部分。该函数无关紧要,因为只是将结果存储到全局变量中,这就是我没有将它放在这里的原因。
```
import camera #this is a file containg the imageProcessing function and frame global variable
cameraThread = threading.Thread(target = camera.imageProcessing)
cameraThread.start()
eventlet.monkey_patch()
app = Flask(__name__)
socketio = SocketIO(app, logger=True, async_mode='eventlet')
@socketio.on('connect', namespace='/web')
def connect_web():
print('[INFO] Web client connected: {}'.format(request.sid))
@socketio.on('message', namespace='/web')
def handle(msg):
while True:
message = {'image': camera.encode_image(camera.frame),'person': camera.person}
time.sleep(0.1)
socketio.emit('stream_response', message, namespace='/web', broadcast=True)
@socketio.on('disconnect', namespace='/local')
def disconnect_web():
print('[INFO] Web client disconnected: {}'.format(request.sid))
@app.route('/', methods=['POST', 'GET'])
def index():
return render_template('index.html', async_mode=socketio.async_mode)
if __name__ == '__main__':
socketio.run(app,host="127.0.0.1", port=5000)
最初我尝试创建一个单独的客户端,其中图像是从相机拍摄并处理的,然后通过网络套接字将结果发送到网络服务器,然后通过网络套接字再次发送到网络客户端,但是这样做时,我有一个延迟〜15秒..我认为这种让网络服务器独立于图像处理应用程序的方法在理论上应该会更好,但我不知道为什么会有这样的延迟..
- 我还要保持图像处理客户端 -> Web 服务器 -> Web 客户端之间的独立性吗?如果是这样,那么有什么建议使用另一种替代/技术,因为我在这种情况下使用 socket.io 有这样的延迟?
- 从架构设计的角度来看,您将如何开发这样的应用程序?例如,您会使用 websockets 来传输视频或其他一些技术吗?您会将图像处理放在单独的客户端/应用程序中并将结果传输到 Web 服务器还是在同一服务器上进行所有处理?
解决方案
推荐阅读
- typescript - 如果我修改它的单个元素,数组不会反应
- websocket - JMeter 中的 Signalr 负载测试
- javascript - Javascript FORTNITE API 请求
- xml - 如何在 XML 中定义前缀并在 XSL 中使用它们?
- javascript - 如何复制部分json?
- webrtc - WebRTC 中 STUN/TURN(coTURN) 服务器和信令服务器(用 socket.io/websocket 编写)之间的区别?
- c++ - 带类的默认模板参数
- assembly - 如果除数为0,如何编写产生0的除法函数?
- c - C 编程:使用 for 循环对用户输入的数字求和时遇到问题
- go - 命令行参数:处理“未定义”错误消息