回覆列表
  • 1 # shuhan舍予

    在之前的幾篇關於OpenCV的文章中我集中介紹了OpenCV中比較常用的操作和函式.在我們基礎的學習中,這些函式其實在影象進行預操作的過程中已經夠用了.因此在之後的文章中,我們要繼續深入使用OpenCV中的一些函式來去實現幾個簡單的例項.能夠在學習的過程中獲得滿足感.

    第一個例項就是從物體跟蹤開始.物體跟蹤分為很多種型別,且每個型別中也都包含了不同的演算法,因此我們今天先從光流法開始,這也是最基礎的演算法來開始學習.

    一:什麼是光流法

    在OpenCV-PythonTutorials上的解釋:光流是物體或者攝像頭的運動導致的兩個連續幀之間的影象物件的視覺運動的模式。它是一個向量場,每個向量是一個位移向量,顯示了從第一幀到第二幀的點的移動。

    上圖表示了一個球在5個連續幀裡的移動。箭頭顯示了它的位移向量。

    光流在日常生活中應用還是很廣泛的,特別是在影片的監控領域,比如從移動構建再到影片拍攝,再到影片壓縮存取,都有很廣泛的應用.

    二:光流法的原理

    在推廣光流法的時候,我們要有兩個前提假設:

    第一:所追蹤的畫素目標在連續的幀之間要保持基本不變.

    第二:所追蹤的畫素目標在連續的幀之間要有相似的運動趨勢.

    現在我們開始推廣一下光流方程:①:假設從首發幀的畫素I(x,y,t),在dt時間之後的下一幀中移動距離為(dx,dy),且這些畫素是相同的,而且亮度不變

    因此得到以下推廣:

    ②:對上邊公式的右邊做泰勒級數近似。除以dt得到下面的等式:

    其中每個引數如下:

    上面的等式被叫做光流等式,但是我們在這裡會發現幾個問題:

    我們可以找到fx和fy,他們是影象的梯度。類似的ft 是沿時間的梯度,這些都可以計算出來.但是(u, v)是未知的。我們無法解出這個等式。因此我們需要用到Lucas-Kanade 方法來解決這些問題.

    三:Lucas-Kanade 方法

    現在我們使用第二條假設,就是所有的相鄰畫素都有相同的移動。LK演算法使用了一個3×3的視窗大小。所以,在這個視窗當中有9個畫素點滿足公式

    將點代入方程,現在的問題就變成了使用9個點求解兩個未知量。

    所以現在我們的問題變成解決了9個方程式,其中兩個未知變數是過度確定的.解的個數大於未知數的個數,這是個超定方程,使用最小二乘的方法來求解最優值.

    觀察上方矩陣,用Harris角點檢測來檢查法逆矩陣的相似性。逆矩陣與Harris角點檢測很像,說明角點是適合用來做跟蹤的.

    使用的解決辦法是利用影象金字塔。在金字塔頂端的小尺寸圖片當中,大幅度的運動就變成了小幅度的運動。所以使用LK演算法,可以得到尺度空間上的光流。這個問題就變得複雜了.

    在下一篇中我們要透過OpenCV中自帶的calcOpticalFlowPyrLK()函式來去實現簡單的光流法.

  • 中秋節和大豐收的關聯?
  • 怎樣取消normal?