您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++ OpenCV如何實現KLT稀疏光流跟蹤,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
實現原理
首先要在初始幀中檢測特征點,之后在下一幀中嘗試跟蹤這些點。你必須找到新的圖像幀中這些點的位置,因此,你必須在特征點的先前位置附近進行搜索,以找到下一幀中它的新位置。輸入兩個連續的圖像幀以及第一幅圖像中檢測到的特征點數組,該函數將返回一組新的特征點為位置。為了跟蹤完整的序列,你需要在幀與幀之間重復這個過程,不可避免地你也會丟失其中一些點,于是被跟蹤的特征點數目會減少。為了解決這個問題,我們可以不時地檢測新的特征值。
函數API
calcOpticalFlowPyrLK( InputArray prevImg, InputArray nextImg,
InputArray prevPts, InputOutputArray nextPts,
OutputArray status, OutputArray err,
Size winSize = Size(21,21), int maxLevel = 3,
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01),
int flags = 0, double minEigThreshold = 1e-4 );
參數說明:
prevImg: 第一幀(跟蹤圖像的前一幀,一般是定位特征點)
nextImg: 第二幀/當前幀
prev_Pts: 第一幀特征點集
next_Pts: 計算輸出的第二幀光流特征點集
status : 狀態標志位,如果對應特征的光流被發現,數組中的每一個元素都被設置為 1, 否則設置為 0。
err:雙精度數組,包含原始圖像碎片與移動點之間的誤差。
代碼演示
我們還是用接著上一章的DEMO,繼續往下做
定義基本數據
上面的API也提到我們會檢測當前幀和前一帖進行處理,所以我們要先定義關于前一幀及當前幀的一些相關數據,下圖紅框內就是我們定義的用于處理的基本數據。
然后在檢測到特征點后判斷前一幀灰度圖是否存在,如果不存在先復制過來
檢測新的特征點
上面紅線標的就是我閃可能在檢測過程中出現的問題,所以我們這里也要改造一下檢測,用我們定義的ftps的參數里面設置一個數值,用于檢測如果數值小于我們設置的數后就重新檢測特征點。我們改造一下尋找特征點這塊。
先放一下原先的檢測代碼,紅框部分是我們要改造地部分
下面這張是我們改造后的源代碼
上面可以看出,我們把檢測出的特征點數組存放到了fpts[0]中,當前一幀的特征點小于30后我們將重新檢測,然后把檢測出的結果存放到前一幀fpts[0]和初始化的特征點IniPoints里,最后再打印一個字符,可以從命令行里看到當前狀態是在檢測特征點,當特征點大于30時我們就打印一個檢測的字符。
實現稀疏光流跟蹤
首先我們先在最上方定義一個HLK跟蹤的方法及跟蹤成功的狀態和誤差參數
然后我們在寫這個方法,這里就用到了我們的calcOpticalFlowPyrLK函數API
然后在上面的跟蹤那里加入這個方法
繪制源圖
最后在源圖上畫出特征點并把當前幀數據放到前一幀里,由于我們把前一幀數據已經轉移到了fpts[0]里,所以這里也改為過來,然后我們又加入了畫出直線的一個操作,用于觀察移動的原點與現在的一個距離。
下面是視頻中的截圖
感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++ OpenCV如何實現KLT稀疏光流跟蹤”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。