我们使用Opencv读取视频时,常规的做法是使用read()函数逐帧读取,如

import cv2cap = cv2.VideoCapture("./test.mp4")
while True:# read a frameret, frame = cap.read()if not ret:break# do something else...
cap.release()

但是在图像处理时,并不需要逐帧处理,而是抽样的方式,这种情况下每一帧都读取会造成计算资源的浪费。查看Opencv的文档,会发现有这么几个函数介绍

virtual bool read (OutputArray image)Grabs, decodes and returns the next video frame. More...virtual bool grab ()Grabs the next frame from video file or capturing device. More...virtual bool retrieve (OutputArray image, int flag=0)Decodes and returns the grabbed video frame. More...

可以看出,read函数其实是grab和retireve函数的组合,grap是跳转到下一帧的位置,而retrieve是做具体的解码工作。显而易见,单纯的跳转要比解码快的多,所以我们不妨修改以下代码,假如抽样频率是5

import cv2cap = cv2.VideoCapture("./test.mp4")
idx = 0
freq = 5
While True:idx += 1ret = cap.grab()if not ret:breakif idx % freq == 1:continueret, frame = cap.retrieve()if frame is None:    # exist broken framebreak# do something else...
cap.release()

读取速度会变成之前的1/5。

virtual bool read (OutputArray image)Grabs, decodes and returns the next video frame. More...virtual bool grab ()Grabs the next frame from video file or capturing device. More...virtual bool retrieve (OutputArray image, int flag=0)Decodes and returns the grabbed video frame. More...

但是对于超大的视频,这样单线程的读取方式还是不够快,因此可以考虑多线程同时读取,以加速处理速度

def process_video(self, start_frame, length):cap = cv2.VideoCapture("./test.mp4")cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)freq = 5for idx in range(length):ret = cap.grab()if not ret:breakif idx % freq == 0:continueret, frame = cap.retrieve()if frame is None:    # exist broken framebreak# do something else...cap.release()

在通过

frames_num = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

获取视频的总帧数,就可以平均分N个线程来处理视频了。

优化OpenCV视频的读取速度相关推荐

  1. Python+OpenCV视频的读取与处理;截取部分图像数据; 边界填充

    视频读取 ●cv2.VideoCapture可以捕获摄像头, 用数字来控制不同的设备,例如0,1. ●如果是视频文件,直接指定好路径即可. import cv2 #opencv默认读取格式是BGR v ...

  2. DivX/XviD -opencv 视频文件读取显示问题解决

    DivX DivX 是将影片的音频由MP3来压缩.视频由MPEG-4技术来压缩,最后再将两部分合成制作而成的.由于MP3和MPEG-4超强的压缩能力,使得影片的容量急剧减少,可以将一部2G大小的DVD ...

  3. Python OpenCV 视频的读取和保存

    1. 打开本地的摄像头,读取视频的每一帧 import cv2 # 1: connect camera via USB , 0: connect camera installed in your co ...

  4. OpenCV视频人脸读取、锚框、狗头替换

    1.调用自己电脑摄像头读取人脸 import cv2 #打开视频 cap = cv2.VideoCapture(0) #打开本机摄像头 while True:flag, frame = cap.rea ...

  5. python opencv读取视频没声音_python + opencv: 解决不能读取视频的问题

    博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像,程序如下: cap = cv2.VideoCapture(0) ret, frame = cap.read() 使用这个程序 ...

  6. Ubuntu下使用Anaconda安装opencv 解决无法读取视频

    Ubuntu下使用Anaconda安装opencv 最近在Ubuntu16.04下使用Anaconda安装opencv,碰到很多坑,记录备忘. cv2.VideoCapture(filename) 返 ...

  7. OpenCV基础教程——视频的读取与写入(超详细+附代码)

    上一篇文章介绍了OpenCV对于图像的处理方法,然而目前对视频的处理分析越来越成为计算机视觉的主流,视频中包含的信息量要远远大于图片,而本质上视频是由一帧帧的图像组成,所以视频处理最终还是要归结于图像 ...

  8. OpenCv图像处理之图像视频摄像头读取和保存

    OpenCv图像处理之图像视频摄像头读取与保存 使用cv::imread()读取图片 使用cv::imwrite()存储图片 使用cv::VideoCapture::open()读取视频 使用cv:: ...

  9. Ubuntu系统下python opencv视频采集:使用USB端口映射指定要读取的相机设备

    Ubuntu16.04 下 python opencv 视频采集:使用USB端口映射指定要读取的相机设备 有时我们需要读取指定设备的视频流,但笔记本电脑通常自带相机,同时可能连接多个USB相机,每次插 ...

最新文章

  1. HMM(隐马尔科夫)用于中文分词
  2. try/catch/finally的简单实践
  3. MySQL知识点链接
  4. hihoCoder #1954 : 压缩树(虚树)
  5. Tomcat:Error starting static Resources
  6. ThinkPHP公共配置文件与各自项目中配置文件组合的方法
  7. 请设计一个栈,实现十进制数转任意进制数。
  8. 好久没弄数学了,一本书上出现了,应该是指代了什么意思,问下.
  9. 只用一个marker 替换 高德_Android基于高德地图完全自定义Marker的实现方法
  10. 深入理解C语言系列之C语言语法陷阱(考题常设置的陷阱点、必须避免的错误和缺陷类型)
  11. 运维管理_运维BIM软件-EcoDomus运维管理系统
  12. BZOJ 2469 [中山市选2010]简单数谜
  13. 再次翻看WCF的书籍
  14. ibm服务器aix系统查看cpu,IBM AIX系统硬件信息查看命令(shell脚本)
  15. 计算机财务管理复利现值的公式,财务管理公式汇总
  16. OFF文件格式_拔剑-浆糊的传说_新浪博客
  17. 不要让采购欺诈吃掉你的利润
  18. RocketMQ报错:service not available now, maybe disk full
  19. Kubernetes 污点和容忍
  20. adb无线连接控制android手机

热门文章

  1. Microsoft Visual Studio International Pack 1.0 Beta1 处理汉字、拼音、笔画转换
  2. 谷歌眼镜晋级:电池续航提高/移除视频通话
  3. 设计原则(5):迪米特原则
  4. Windows升级日志文件可以删除吗?
  5. GitLab支持Ldap认证配置
  6. eclipse的java断点调试
  7. 苹果失足启示录:这是一个价值4400亿美元的教训
  8. 并查集之面试题 17.07. 婴儿名字
  9. 华创证券-成交量的奥秘:另类价量共振指标的择时
  10. 微信支付v3 签名与验签