我需要定期将处理过的帧从opencv-python发送到nodejs前端。我使用flask-socketio在nodejs和opencv-python之间进行通信。
我能够通过在while循环中的每个迭代结束时发出来获得输出。但是那里有延迟,而且我的fps还不够好。
如何提高实时视频处理的FPS?
我试过将flask-socketio的async_mode作为eventlet,当我在emit行之后使用sleep时,它只在每个循环中发出。睡眠会进一步降低FPS。在async_mode线程中,在没有休眠的情况下,每次循环迭代都会发生emit。这提供了更好的FPS,但与没有emit的相比仍然很少。
vs = cv2.Videocapture(path)
while(vs.isOpened()):
ret, fr = vs.read()
//do some processing
emit('frame', fr)没有发射线,我可以得到55-60FPS,但有了发射线,我只能勉强达到20FPS。如何加快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发布于 2019-07-26 01:55:10
不幸的是,将CPU密集型任务(如使用异步或多线程服务器执行的图像处理)组合在一起并不是一个好主意。
您认为在eventlet的情况下,“睡眠”会使一切变慢。这只是部分正确的。休眠是在基于greenlet的进程中启用并发的唯一方法。休眠所做的一切(假设您调用sleep(0))就是让其他任务分享CPU。问题是,当其他任务运行时,具有视频循环的任务必须等待。
线程的情况预计也会有性能问题,但原因不同。在多线程的情况下,PIL (Python解释器锁)将确保一次只有一个线程执行Python代码。因此,当您进行视频处理时,所有Socket.IO线程都会被阻塞,反之亦然。
如果您真的想实现真正的多任务处理,最好的解决方案是将视频处理工作从Socket.IO服务器移到一个单独的进程中。
https://stackoverflow.com/questions/57088967
复制相似问题