Opencv3.0-python的那些事兒:(九)、Opencv關於如何讀取大量視訊幀進行處理的方法
阿新 • • 發佈:2019-01-11
一個真實的專案需求,需要讀取視訊的幀然後對這些幀做資料處理,因此用的是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(幀陣列不空) { 批處理() 清空幀陣列,釋放記憶體 }