【发布时间】:2019-07-18 07:12:44
【问题描述】:
我需要定期将处理过的帧从 opencv-python 发送到 nodejs 前端。我正在使用 flask-socketio 在 nodejs 和 opencv-python 之间进行通信。
我可以通过在 while 循环中的每次迭代结束时发出来获得输出。但是有延迟,我没有得到足够好的 fps。
如何提高实时视频处理的 FPS?
我已经尝试将 flask-socketio 的 async_mode 作为 eventlet,当我在发出线之后使用 sleep 时,它只为每个循环发出。睡眠会导致 FPS 进一步降低。在 async_mode 线程上,每次没有睡眠的循环迭代都会发生发射。这提供了更好的 FPS,但与没有发射的情况相比仍然非常少。
vs = cv2.Videocapture(path)
while(vs.isOpened()):
ret, fr = vs.read()
//do some processing
emit('frame', fr)
没有发射线我能够获得 55-60 FPS,但使用发射我几乎无法达到 20 FPS。如何加快python和nodejs之间的通信速度
更新:添加 requirements.txt
aiodine==1.2.6
aiohttp==3.5.4
altgraph==0.16.1
asgiref==3.1.2
async-timeout==3.0.1
attrs==19.1.0
bocadillo==0.16.1
certifi==2019.3.9
chardet==3.0.4
Click==7.0
cycler==0.10.0
dnspython==1.16.0
eventlet==0.25.0
Flask==1.0.3
Flask-SocketIO==4.1.0
future==0.17.1
greenlet==0.4.15
h11==0.8.1
idna==2.8
imutils==0.5.2
itsdangerous==1.1.0
Jinja2==2.10.1
kiwisolver==1.1.0
MarkupSafe==1.1.1
matplotlib==3.1.0
minidump==0.0.6
monotonic==1.5
multidict==4.5.2
nest-asyncio==1.0.0
netifaces==0.10.6
numpy==1.16.4
object-detection==0.1
opencv-contrib-python==4.0.1.24
opencv-python==3.4.2.17
pandas==0.24.2
pefile==2019.4.18
pudb==2019.1
Pygments==2.4.2
pyparsing==2.4.0
python-dateutil==2.8.0
python-engineio==3.8.1
python-multipart==0.0.5
python-socketio==4.1.0
pytz==2019.1
pywin32-ctypes==0.2.0
requests==2.22.0
six==1.12.0
starlette==0.12.0
tqdm==4.32.1
typesystem==0.2.2
urllib3==1.25.3
urwid==2.0.1
uvicorn==0.7.2
websockets==7.0
Werkzeug==0.15.4
whitenoise==4.1.2
yarl==1.3.0
【问题讨论】:
-
我认为将 opencv 和视频处理任务与异步服务器结合起来会有问题。您可以将您在 Python 端使用的依赖项添加到您的问题中吗?特别是,了解您是否使用 eventlet、gevent 或任何其他异步框架非常重要。只需将
pip freeze的输出复制到问题中即可。 -
嗨@Miguel,我已按照您的要求添加了 pip freeze 输出。你能根据更新提供一些帮助吗?
标签: flask-socketio