python实现视频关键帧提取(基于帧间差分)
python實現視頻關鍵幀提取(基于幀間差分)
在很多場景下,我們不想或者不能處理視頻的每一幀圖片,這時我們希望能夠從視頻中提取出一些重要的幀進行處理,這個過程我們稱為視頻關鍵幀提取。
關鍵幀提取算法多種多樣,如何實現主要取決于你對于關鍵幀的定義。
也就是說,對于你的實際應用場景,視頻中什么樣的圖片才算是一個關鍵幀?
今天我實現了一種比較通用的關鍵幀提取算法,它基于幀間差分。
算法的原理很簡單:我們知道,將兩幀圖像進行差分,得到圖像的平均像素強度可以用來衡量兩幀圖像的變化大小。因此,基于幀間差分的平均強度,每當視頻中的某一幀與前一幀畫面內容產生了大的變化,我們便認為它是關鍵幀,并將其提取出來。
算法的流程簡述如下:
首先,我們讀取視頻,并依次計算每兩幀之間的幀間差分,進而得到平均幀間差分強度。
然后,我們可以選擇如下的三種方法的一種來提取關鍵幀,它們都是基于幀間差分的:
使用差分強度的順序
我們對所有幀按照平均幀間差分強度進行排序,選擇平均幀間差分強度最高的若干張圖片作為視頻的關鍵幀。
使用差分強度閾值
我們選擇平均幀間差分強度高于預設閾值的幀作為視頻的關鍵幀。
使用局部最大值
我們選擇具有平均幀間差分強度局部最大值的幀作為視頻的關鍵幀。
這種方法的提取結果在豐富度上表現更好一些,提取結果均勻分散在視頻中。
需要注意的是,使用這種方法時,對平均幀間差分強度時間序列進行平滑是很有效的技巧。它可以有效的移除噪聲來避免將相似場景下的若干幀均同時提取為關鍵幀。
這里比較推薦使用第三種方法來提取視頻的關鍵幀
獲取源碼點這里
最初的代碼來自于這里, 但是其代碼本身有些問題,在讀取超過100M的視頻時程序會出現內存溢出的錯誤,因此我對其進行了優化,減去了不必要的內存消耗。
在精靈寶可夢的一個經典片段中進行了實驗,平滑后的平均幀間差分強度如下圖所示:
提取的部分關鍵幀如下所示:
效果還不錯吧~
我這里僅僅是對視頻關鍵幀提取的方法進行了簡單的探索,最終得到的效果也滿足了我實際工作的需要。如果您對視頻關鍵幀提取領域很了解,或者了解其他更好的方法,期待與您交流~
最后,對算法感興趣的小伙伴,歡迎關注我的github項目AI-Toolbox。
此項目旨在提高效率,快速迭代新想法,歡迎貢獻代碼~
總結
以上是生活随笔為你收集整理的python实现视频关键帧提取(基于帧间差分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外设驱动库开发笔记25:FM25xxx
- 下一篇: OpenJTAG调试S3C2440裸板程