Python多进程opencv

前几天遇到了一个问题,利用opencv程序调取rtsp视频流,因为处理程序要消耗的CPU时间过于长,VideoCapture的read是按帧读取,所以经常导致内存溢出,延时还高得出奇。

所以想到是不是可以利用多进程把读取视频和处理视频分开,这样就可以消除因处理图片所导致的延迟。

所用库

multiprocessing

gc

opencv-python

os

实现方法

一开始是想用多线程,但是因为GIL的存在,像实时处理视频这样的CPU密集型任务多线程等于没用。然后就选择了多进程。

然后要考虑怎样在两个进程中传参的问题:

multiprocessing中有Quaue、SimpleQuaue等进程间传参类,还有Manager这个大管家。

Quaue这一类都是严格的数据结构队列类型

Manager比较特殊,它提供了可以在进程间传递的列表、字典等python原生类型

还要考虑怎样才能达到处理进程可以在读取进程中得到最新的一帧:

其实VideoCapture是一个天生的队列,先进先出。如果要达到实时获得最新帧的目的,就需要栈来存储视频帧,而不是队列。

这样的话,Quaue这一大类就都没有可能了,肯定不能用它来传参。

提到栈突然想到了python的列表,它的append和pop操作完全可以当”不严格“的栈来用。所以顺理成章地multiprocessing.Manager.list就是最好的进程间传参类型。

再就是传参栈自动清理的问题,压栈频率肯定是要比出栈频率高的,时间一长就会在栈中积累大量无法出栈的视频帧,会导致程序崩溃,这就需要有一个自动清理机制:

设置一个传参栈容量,每当达到这个容量就直接把栈清空,再利用gc库手动发起一次python垃圾回收。这样就不会导致严重的内存溢出和程序崩溃。

实现代码

import os

import cv2

import gc

from multiprocessing import Process, Manager

# 向共享缓冲栈中写入数据:

def write(stack, cam, top: int) -> None:

"""

:param cam: 摄像头参数

:param stack: Manager.list对象

:param top: 缓冲栈容量

:return: None

"""

print('Process to write: %s' % os.getpid())

cap = cv2.VideoCapture(cam)

while True:

_, img = cap.read()

if _:

stack.append(img)

# 每到一定容量清空一次缓冲栈

# 利用gc库,手动清理内存垃圾,防止内存溢出

if len(stack) >= top:

del stack[:]

gc.collect()

# 在缓冲栈中读取数据:

def read(stack) -> None:

print('Process to read: %s' % os.getpid())

while True:

if len(stack) != 0:

value = stack.pop()

cv2.imshow("img", value)

key = cv2.waitKey(1) & 0xFF

if key == ord('q'):

break

if __name__ == '__main__':

# 父进程创建缓冲栈,并传给各个子进程:

q = Manager().list()

pw = Process(target=write, args=(q, "rtsp://xxx:xxx@192.168.1.102:554", 100))

pr = Process(target=read, args=(q,))

# 启动子进程pw,写入:

pw.start()

# 启动子进程pr,读取:

pr.start()

# 等待pr结束:

pr.join()

# pw进程里是死循环,无法等待其结束,只能强行终止:

pw.terminate()

实际上这个程序就是把VideoCapture的队列读取改成了栈读取。这个程序可以写成一个类,来作为一个新形式的VideoCapture。

TODO

并没有加入进程锁,只是有一些防止栈空出栈的判断,这样并不能达到进程安全。最好还是加锁

python视频延迟严重_利用多进程降低opencv视频延迟处理rtsp视频流相关推荐

  1. 腾讯视频下载格式_怎么下载腾讯视频

    不管这个腾讯视频好用与否,都有一大批用户,本文播放器家园网小编分享腾讯视频下载格式_怎么下载腾讯视频.腾讯视频时刻为您推荐最新最火的视频,精彩不断随时观看.支持各种画质的下载,没网也能享受高视觉的享受 ...

  2. 腾讯视频下载的视频怎么剪辑_怎样卸载腾讯视频

    腾讯视频影音是一款界面轻松友好,功能全面完善,方便好用,绿色安全,完全免费的.专注视频播放的客户端软件,您可运行腾讯视频影音,在线享受腾讯视频网站内全部免费高清正版视频.腾讯视频可以在线享受丰富多彩的 ...

  3. python 视频转场_利用Python 进行短视频的二次创作

    1.目 标 场 景 无论是抖音还是快手等视频平台,一旦一个视频火了后,很多 UP 主都会争先抢后去模仿拍摄或剪辑,然后上传到平台,最后都能带来不错的流量. 对于一般的短视频,完全可以通过裁剪.特效转场 ...

  4. python自定义函数画图_利用Python绘图和可视化(长文慎入)

    Python有许多可视化工具,但是我主要讲解matplotlib(http://matplotlib.sourceforge.net).此外,还可以利用诸如d3.js(http://d3js.org/ ...

  5. 利用python进行数据分析数据_利用Python进行数据分析

    1.注释以及在Subplot上绘图 除标准的图表对象之外,你可能还希望绘制一些自定义的注释(比如文本.箭头或其他图形等). 注释可以通过text.arrow和annotate等函数进行添加.text可 ...

  6. 视频弹窗播放html,利用jQuery实现在线视频弹出播放代码

    特效描述:利用jQuery实现 在线视频 弹出播放代码.利用jQuery实现在线视频弹出播放代码 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 视频一 2018-06-22 视频一 ...

  7. python 多帧 超分辨_利用python-opencv生成视频帧数控制,和常见错误总结

    首先呢 利用opencv生成视频的例子相信网络上已经很多了.但是大多数例子都只是捕获一个摄像头就没了.但是在实际运用中会发现.因为涉及到图像处理,生成的视频要不就就是过快要不就是比实际时间长. 控制视 ...

  8. python 视频字幕替换_利用python调整srt字幕时间轴

    我们有时候下载了超高清资源但是没有合适的字幕,往往由于资源的不同,视频和字幕会有几秒钟的时差,这个时候选择重新下载视频显得十分的麻烦. 批量调整字幕时间轴就是一个很好的办法.网上关于调整字幕时间轴有很 ...

  9. python计算密集型提速_利用Cython加速计算密集型python任务

    何为计算密集型任务 下面贴上网上找到的描述计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率.对视频进行高清解码等等,全靠CPU的运算能力.这种计算密集型任务虽然也可以用多任务完成 ...

最新文章

  1. Go语言基础之数据类型
  2. cellpadding,cellspacing都是废弃的属性了,早已不推荐使用,最新的html5里已经彻底去掉了这些表现型的属性。
  3. 在JavaScript中使用正好两位小数格式化数字
  4. 6.排序算法最优的时间复杂度
  5. Transact_SQL小手册(各种sql语句大集合)
  6. leetcode470 Java_Java实现 LeetCode 794 有效的井字游戏 (暴力分析)
  7. Exchange 2007 安裝(-)
  8. 【竞赛题解】Codeforces Round #715 (Div. 2) C
  9. 计算机网络与通信02339,4月全国高等教育自学考试计算机网络与通信试题及答案解析.docx...
  10. 1.3MB 的超轻YOLO算法!全平台通用,准确率接近YOLOv3,速度快上45%丨开源
  11. oracle定时删库,随手胡乱写的批处理,实现Oracle每天定时备库,DMP文件保留3天,3天后删除,对应2000系统...
  12. java excel导出功能_java中的Excel导出功能
  13. 30 万奖金悬赏 | CSDN 软件开发精英赛即日启动
  14. MongoDB管理与监控
  15. [ASP.NET]NTKO插件使用常见问题
  16. 计算机二级C++知识点归纳之公共基础
  17. 常微分方程(1):可分离变量的方程
  18. 简明理解 行列式和秩
  19. java pacs上传服务_医疗pacs系统影像数据的同步方法及前置服务器的制造方法
  20. 详细 | 图神经网络从入门到入门

热门文章

  1. 计算机的iscsi配置,我们将了解如何设置自己的支持iscsi配置的存储节点
  2. java中fis和fos_java中-的流-与操作
  3. 在lcd屏幕上窗口显示一个bitmap_SmartDrop——LED/LCD大屏内容投屏管理软件
  4. Win11蓝屏100%不重启解决方法
  5. QQ浏览器如何更改截图路径
  6. win7系统电脑语言栏怎么更换输入法
  7. autoscan、aclocal、automake和autoconf区别
  8. java获取net地址 本机
  9. java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令
  10. Linux中使用netstat命令的基本操作,排查端口号的占用情况