1. 程式人生 > >Opencv3.0-python的那些事兒:(九)、Opencv關於如何讀取大量視訊幀進行處理的方法

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(幀陣列不空)
{
	批處理()
	清空幀陣列,釋放記憶體
}