Opencv3.0-python的那些事儿:(九)、Opencv关于如何读取大量视频帧进行处理的方法

一个真实的项目需求,需要读取视频的帧然后对这些帧做数据处理,因此用的是opencv3.0(python)来做的,熟悉opencv3.0的朋友知道,它提供了VideoCapture方法可以读取视频,并生成帧。

刚开始,我是把从视频中所有的帧全部存在一个数组中,然后处理。后来发现在1GB内存的Ubuntu中,1个1分55秒的视频,平均帧率为10帧/s,生成了1100多帧,然后内存耗尽,Ubuntu系统死机。

分析:以一个2分钟左右,平均帧率为10帧/秒的视频为例进行分析,如果设保存下来的一帧大概转换成图片约170KB,1000帧大概占的内存就有170M,如果机器的内存不大的话,机器可能内存耗尽。

       解决方法:

1、后来尝试把Ubuntu内存容量开到2GB,勉勉强强跑起来,但是这才只是一个2分钟的视频,显然这样做无疑是杯水车薪,一旦碰到几十分钟的视频,内存更大的机器一般也会起不来。

        2、一个好的方法是用批处理来做,每次处理k个帧(比如500帧),处理完了之后就把保存帧的数组清空,把占的内存释放掉,继续做下一批处理。

这个思想同样应该可以迁移到大数据处理上。


下面以批处理的数量500为例,具体描述批处理算法的框架

i=0
while(视频没有读取完)
{
	把当前帧存入数组
	if ( (i+1) % 500 == 0 )
	{
		批处理()
		清空帧数组,释放内存
	}
	i++
}
if(帧数组不空)
{
	批处理()
	清空帧数组,释放内存
}









你可能感兴趣的:(Opencv3.0-python的那些事儿:(九)、Opencv关于如何读取大量视频帧进行处理的方法)