光流(Optical Flow)算法原理及示例

2021-01-08 不靠譜的貓

光流的概念最早是由Gibson在1950年提出的。它是空間移動物體在像素觀察平面中移動的瞬時速度。是一種計算物體在相鄰幀間運動信息的方法。

一般來說,光流(Optical Flow)是物體在三維空間中的運動在二維像平面上的投影。它是由物體和相機的相對速度產生的,反映了物體在極小時間內對應的圖像像素的運動方向和速度。

Lucas–Kanade方法(KLT)是一種基於光流原理的特徵點跟蹤算法。本文首先介紹光流的原理,然後介紹了KLT及其相關的KLT變體算法。

光流約束方程

假設I(x,y,t)為時刻t像素點(x,y)的像素值(亮度),該像素點在兩個圖像幀之間移動了Δx,Δy,Δt。因此我們可以得出相同亮度的結論:

假設運動很小,我們可以從泰勒級數推導一階泰勒展開式:

因此,

其中(dx/dt, dy/dt) = (u, v)為待解像素的光流。

(I/x,I/y) = (I_x, I_y)是像素灰度空間微分,t = I_x是像素坐標點的時間灰度微分。

整理成矩陣形式:

該公式表明,同一坐標位置上的時間灰度微分是空間灰度微分與該位置上相對於觀測者的速度的乘積。假設空間一致性,對於周圍的多個點,有:

這個方程組的方程多於未知數,因此通常是超定的。Lucas-Kanade方法通過最小二乘原理獲得折衷解決方案:

這就是光流算法的孔徑問題。為了找到光流,需要另一組方程,並附加約束條件。所有的光流方法都引入了估算實際流的附加條件。

局部差分法:Lucas-Kanade算法

為了使方程可求解,進行以下假設:

亮度是恆定的,圖像中對象的像素亮度在連續幀之間不會改變;短距離(短期)運動,相鄰幀之間的時間足夠短,並且物體運動很小;空間一致性,相鄰像素具有相似的運動;恆定亮度是指某些像素的跟蹤不隨時間變化:

公式表示被跟蹤像素的灰度不隨時間變化:

連續時間意味著相鄰幀之間的運動很小。換句話說,運動的變化可以被認為是亮度相對於時間的導數。一維空間的示例:

其中,Ix是圖像的偏導數,It是圖像隨時間的導數,v是所需速度。

與之前直接比較像素灰度值的方法不同,Lucas-Kanade算法比較像素周圍的窗口像素以找到最相似的像素。假設光流在短時間τ內,前後兩幀滿足:

其中D為變形矩陣,d稱為位移向量,D表示兩像素窗口塊移動後的變形量,因此,當窗口較小時,將更加難以估計。通常,D可用於測量兩個像素窗口的相似度,即特徵點是否漂移。對於光流跟蹤,通常僅考慮平移模型:

為了通用性,我們使用仿射運動模型來推導Lucas-Kanade算法的原理。在像素窗口下,構造誤差函數:

其中w(x)是權重函數,可以定義為高斯函數。分別對變量d和D進行微分:

其中

記住光流u = Dx + d,然後對運動後的像素點進行泰勒展開:

這裡給出了平移運動模型的結果。設D = 0:

其中Z是2×2矩陣,e是2×1向量。這是一個線性方程優化問題。當Z是可逆的時,可以輕鬆地求解該方程。由於泰勒展開式是在推導過程中使用的,因此僅當像素位移較小時才成立。在實際操作中,通常每次將最後結果用於初始化和進一步解決時(在Newton-Raphson Fasion中),都需要迭代解決。

工作實例

在光流可以工作之前,我們必須給它提供一組關鍵點以在兩個圖像幀之間進行跟蹤。

在下面的示例中,我們使用了Shi-Tomasi corner detector,該detector使用與Harris corner detector相同的過程來查找構成圖像中「角點」的強度模式,只是它增加了一個額外的參數來幫助選擇最突出的角點。

一旦我們在我們感興趣的初始圖像上檢測到關鍵點,我們就可以計算這幅圖像(幀1)和下一幀(幀2)之間的光流。它接收初始圖像幀、下一幅圖像幀和一組點,並返回下一幀中檢測到的點和一個值,該值指示從一幀到下一幀的點之間的匹配程度。

這些參數還包括窗口大小和maxLevels,它們指示窗口的大小以及將使用pyramid縮放來縮放給定圖像的級數。對匹配點進行迭代搜索,最後一個參數反映了這個匹配條件(如果使用不同的圖像,您可能需要更改這些值,但是這些值應該適用於提供的示例)。Python示例代碼如下

接下來,讓我們顯示最終的運動向量,Python示例代碼如下

相關焦點

  • OpenCV-Python 光流|四十八
    我們將使用cv.calcOpticalFlowFarneback()方法創建一個密集的光流場。光流光流是由物體或照相機的運動引起的兩個連續幀之間圖像物體的視運動的模式。它是2D向量場,其中每個向量都是位移向量,表示點從第一幀到第二幀的運動。
  • OpenCV系列之光流 | 四十八
    因此,從用戶的角度來看,這個想法很簡單,我們給一些跟蹤點,我們接收到這些光流矢量點。但是同樣存在一些問題。到現在為止,我們只處理小動作,所以當大動作時它就失敗了。為了解決這個問題,我們使用金字塔。當我們上金字塔時,較小的動作將被刪除,較大的動作將變為較小的動作。因此,通過在此處應用Lucas-Kanade,我們可以獲得與尺度一致的光流。
  • 輸入示例,自動生成代碼:TensorFlow官方工具TF-Coder已開源
    項目地址:https://github.com/google-research/tensorflow-coderGoogle Colab 試用地址:https://colab.research.google.com/github/google-research/tensorflow-coder/blob/master/TF-Coder_Colab.ipynb
  • TensorFlow系列專題(五):BP算法原理
    原創 | 磐石001出品 | 磐創AI技術團隊一.反向傳播算法反向傳播算法[1](Backpropagation Algorithm,簡稱BP算法)是深度學習的重要思想基礎,對於初學者來說也是必須要掌握的基礎知識,在這一小節裡,我們會較為詳細的介紹這一重點知識。
  • TensorFlow入門簡介,新手請看這裡!
    【IT168 技術】  TensorFlow是一個使用數據流圖進行數值計算的開源軟體庫,是谷歌基於DistBelief研發的第二代人工智慧學習系統,命名來源於本身的運行原理Tensor(張量)意味著N維數組,Flow(流)意味著基於數據流圖的計算,TensorFlow為張量從流圖的一端流動到另一端的計算過程。TensorFlow將複雜的數據結構傳輸至人工智慧神經網絡進行分析和處理。  2017年2月,TensorFlow 1.0版正式發布,其當年的提交數目就已超過2.1萬,其中還有部分外部貢獻者。
  • MaskFlownet:基於可學習遮擋掩模的非對稱特徵匹配丨CVPR 2020
    編者按:在光流預測任務中,形變帶來的歧義與無效信息會干擾特徵匹配的結果。在這篇 CVPR 2020 Oral 論文中,微軟亞洲研究院提出了一種可學習遮擋掩模的非對稱特徵匹配模塊 ,它可以被輕鬆結合到端到端的基礎網絡中,無需任何額外數據和計算開銷就可以學習到遮擋區域,從而顯著改進光流預測的結果。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    本文依據對Tensorflow(簡稱TF)白皮書[1]、TF Github[2]和TF官方教程[3]的理解,從系統和代碼實現角度講解TF的內部實現原理。以Tensorflow r0.8.0為基礎,本文由淺入深的闡述Tensor和Flow的概念。先介紹了TensorFlow的核心概念和基本概述,然後剖析了OpKernels模塊、Graph模塊、Session模塊。1.
  • TensorFlow極速入門
    作者孟曉龍,2016年加入Qunar,目前在去哪兒網機票事業部擔任算法工程師。熱衷於深度學習技術的探索,對新事物有著強烈的好奇心。本教程不是 cookbook,所以不會將所有的東西都事無巨細的講到,所有的示例都將使用 python。那麼本篇教程會講到什麼?首先是一些基礎概念,包括計算圖,graph 與 session,基礎數據結構,Variable,placeholder 與 feed_dict 以及使用它們時需要注意的點。
  • 玩轉TensorFlow?你需要知道這30功能
    Tensor 的意思是張量,代表 N 維數組;Flow 的意思是流,代表基於數據流圖的計算。把 N 維數字從流圖的一端流動到另一端的過程,就是人工智慧神經網絡進行分析和處理的過程。我可以用它來仔細檢查數據,以確保所有類別的數據都沒有受到負面影響網址是:https://www.tensorflow.org/tfx/model_analysis/?hl=zh-cn6)TFX-服務服務使得部署新算法+實驗變得容易,但是仍然能保持相同的伺服器架構+API。它不僅可以直接支持 TensorFlow 上的模型,也可以支持其它模型。
  • 異常檢測常用光流法量化對比:Farneback/Horn-Schunck / Lucas...
    快速獲得最新乾貨本文由博主VG-Lin授權發布,禁止二次轉載三種光流法的OpenCV-API(一) Horn-Schunck光流法CalcOpticalFlowHSHorn–Schunck光流算法用一種全局方法估計圖像的稠密光流場(即對圖像中的每個像素計算光流)算法原理參考論文:Determining
  • 【強化學習實戰】基於gym和tensorflow的強化學習算法實現
    1新智元推薦【新智元導讀】知乎專欄強化學習大講堂作者郭憲博士開講《強化學習從入門到進階》,我們為您節選了其中的第二節《基於gym和tensorflow的強化學習算法實現》,希望對您有所幫助。同時,由郭憲博士等擔任授課教師的深度強化學習國慶集訓營也將於 10 月 2 日— 6 日在北京舉辦。
  • Facebook用「SLAM+實時光流」實現AR真實遮擋效果
    針對這種情況,Facebook提出了一種新穎算法,其可以將稀疏深度實時傳播至每個像素。生成的深度圖在時間空間方面十分平滑,但在深度邊緣顯示出明顯的不連續性。這使得AR效果可以與真實場景完全交互並被其遮擋。
  • 基於OpenCV和Tensorflow的深蹲檢測器
    mask = cv.dilate(mask, None, 3)將此算法應用於所有圖像幀可以得出每一幅圖像中的姿勢。之後,我們將它們分類為站立,下蹲以及無三種情況。接下來我們將使用Keras 與Tensorflow進行分類。最初,我們使用了經典的Lenet-5模型,運行結果良好。隨後由於閱讀了一些有關Lenet-5變體的文章後,我們決定嘗試簡化架構。
  • Rift S將支持NVIDIA Optical Flow SDK,優化透視和ASW功能
    儘管Rift S前置攝像頭的刷新率可能並不夠高,但是觀感足夠自然和清晰,原理是,通過對比兩顆前置攝像頭同時捕捉到的畫面,便可還原視覺差異的信息,從圖像中推斷出環境的深度信息。而Passthrough+功能則能實現實時的預測,並優化ASW功能。
  • 1966年諾貝爾物理學獎—雷射光泵激(optical pumping)技術
    這便是「光泵激」的基本思想。 關於optical pumping術語的翻譯說明pumping有多個翻譯:泵浦、抽運、泵,泵激。在反覆比較術語後,個人認為泵激更為準確,下面分別來闡述理由。在GB/T15313-2018雷射術語[4]中,被翻譯為泵浦,這裡應當是音譯,那麼optical pumping的翻譯就是光泵浦,但泵浦兩個字對非雷射專業人員很難理解這是什麼意思。文獻[5][6]將pumping翻譯為抽運,意思應當就是抽取運輸的意思,但這個與optical pumping實際表示將能量供給粒子,激發粒子使其由低能態躍遷到高能態的過程不符。
  • 深度學習的敲門磚:手把手教你TensorFlow初級入門
    另一方面,Python語言的簡潔意味著許多處理都在後臺進行,因此我們應該熟悉它背後的原理。通過示例和代碼,大家可以對TensorFlow有一個初步了解。例如如何運用TensorFlow計算大數據的統計信息。 因此本文的重點將完全是關於如何使用TensorFlow,而不是一般的機器學習算法運用。 機器學習算法需要大量的數學運算。 通常,某個算法可以歸結為簡單函數組合的迭代,直到它收斂為止。 當然,也可以使用任何標準程式語言來執行這些計算。
  • opencv教程-光流法
    opencv裡的光流法有兩種,稀疏光流法 和 稠密光流法。簡單理解的話光流就是一個向量,包含在一定時間間隔內x方向位置的變化、y方向位置的變化,所以其三個主要因素就是dx,dy,dt。主要輸入:prevImg:前一張灰度圖nextImg:當前圖片prevPts:要匹配的點(比如拐點、角點),float主要輸出:nextPts:根據prevPts以及當前圖像計算的新點status:nextPts與prevPts是否匹配狀態,1為匹配,0為不匹配err:光流點匹配的錯誤信息
  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    下面是本文整理的資料內容:在安裝之前,這裡先列出一些對TensorFlow給出大略介紹的文章,其中包括一些重要的概念解釋,TensorFlow的具體含義和優點,以及TensorFlow的基本工作原理等。1.
  • 機器學習中的embedding原理及tensorflow 相關API的理解
    # 概述本文主要講解tensorflow中涉及embedding的API。之前看了一些文章,寫的雲山霧繞,花了好長時間才搞懂,太笨了。embedding 算法主要用於處理稀疏特徵,應用於NLP、推薦、廣告等領域。所以word2vec 只是embbeding 思想的一個應用,而不是全部。