處理視頻序列
視頻信號是由按序列排放的圖像(幀)組成,它們是通過有規律的間隔進行拍攝以展示動態的場景。
一、讀取視頻序列
1.原理及概念
(1)通過重複調用read方法獲取視頻序列,這裡需要注意為了打開視頻計算機中必須安裝有對應的解碼器,否則cv::VideoCapture將無法理解視頻格式,關於視頻的編解碼可以查看ffmpeg.org站點提供了完整的開源及跨平台解決方案,可用於音視頻錄製、轉換以及流媒體,Opencv中操作視頻文件的類就是基於ffmpeg。xvid.org站點提供了基於MPEG-4視頻壓縮標準的開源編解碼庫。Xvid也有名為DivX的競爭者,後者提供私有但免費的編解碼工具。
2.實驗
源碼示例(參考原文)
播放視頻
二、處理視頻幀
源碼示例(參考原文)
程序運行效果
三、寫入視頻序列
比較簡單直接上代碼
源碼示例(參考原文)
這裡需要主要計算機中必須安裝有相應的編解碼,可以通過cv::VideoWriter類的open方法的第二個參數傳入-1參看編解碼
四、用光流法實現視頻中的特徵跟蹤
1.概念及原理
(1)在開始跟蹤前,首先要在初始幀中檢測特徵點,之後在下一幀中嘗試跟蹤這些點。你必須找到新的圖像幀中這些點的位置。很明顯的,由於我們處理的是視頻序列,很有可能特徵點所在的物體已經移動過(運動也有可能是相機引起的)。因此,你必須在特徵點的先前位置附近進行搜索,以找到下一幀中它的新位置。這正是cv::calcOpticalFlowPyrLK函數所實現的工作。你輸入兩個連續的圖像幀以及第一幅圖像中檢測到的特徵點數組,該函數將返回一組新的特徵點為位置。為了跟蹤完整的序列,你需要在幀與幀之間重複這個過程,不可避免地你也會丟失其中一些點,於是被跟蹤的特徵點數目會減少。為了解決這個問題,我們可以不時地檢測新的特徵值。
(2)我們假設特徵點的強度在相鄰幀之間不發生變化,那麼我們要找到一個偏移量(u,v):
其中,分別是當前幀以及下一時刻的值,這個強度不變的假設對於拍攝時間相近的圖像中的微小偏移量而言都是成立的。我們可以使用泰勒展開式來近似這個方程即
如果強度不變假設成立,可以推出另一個方程式
這個著名的約束便是基礎光流約束方程式,引入另一個假設,它被使用於Lukas-Kanade特徵跟蹤演算法。
2.實驗
源碼示例(參考原文)
實驗效果
五、提取視頻中的前景物
1.概念及原理
(1)有時相機固定背景幾乎不變,我們感興趣的元素只有場景中運動的物體,我們可以通過對背景建模然後將當前幀的模型與背景模型進行比較檢測前景物體,前景提取是只能監控中的基礎步驟。
(2)如果我們能夠獲取當前場景背景的圖像,那麼通過簡單的圖像差分便可以提取出前景:
cv::absdiff(backgroundImage,currentImage,foreground);
差異足夠大的像素都將被視為前景像素。但是背景通常會隨著時間變化,我們必須能夠動態創建背景的模型,這可以通過長時間觀察場景來實現。 定期更新背景模型:通過計算滑動平均值,即對時序信號計算均值時考慮接收到的最新值。如果p(t)是t時刻的像素值,u(t-1)是當前的平均值,那麼新的平均值將是 u(t)=(1-a)[u(t-1)]+ap(t) 參數a被稱為學習率,它定義了當前值對平均值的影響程度。該值越大,滑動平均值對觀察值的適應速度更快。
2.實驗
源碼示例(參考原文)
實驗結果
Reference:
【OpenCV學習筆記 013】處理視頻序列 配套的源碼下載
【視音頻圖像技術、人工智慧、機器人技術探索以及職場生活】
TAG:DaveBobo |