機器學習實踐系列之6 OpenCV實戰光流

2021-07-27 02:32:36 字數 1991 閱讀 6468

光流(optical flow)是運動物體運動帶來的畫素變化,表示 畫素空間的運動速度,直觀也可以理解為光的流動。一般而言,光流是由於場景中前景目標本身的移動、相機的運動,或者兩者的共同運動所產生的。

光流分為稀疏光流稠密光流

• 稀疏光流

所謂稀疏光流,是指 金字塔lucas-kanade 方法(簡稱 lk 方法),演算法分為兩步:

1. 通過 goodfeaturestotrack() 來尋找角點,也就是稀疏的概念;2. 針對獲得的兩組corner角點,通過 calcopticalflowpyrlk() 來 進行跟蹤 match。這一步是lk光流的關鍵,裡面用到了複雜的多尺度特徵(金字塔),此處不再展開,大家可以看opencv原始碼。

相對於稠密光流,稀疏光流只需要對關鍵點進行計算,計算量較小,經常被用於影象配準目標跟蹤

下圖是特徵點檢測goodfeaturestotrack 和光流計算calcopticalflowpyrlk 效果(**會在最後給出):

• 稠密光流

稠密光流需要針對整副圖計算畫素偏移量(ps:確實夠稠密的),可以對整幅圖進行畫素級別的配準,其效果要優於稀疏光流,在某些要求比較高的場合下有應用,可以參考 facebook 開源的 surround360 vr全景相機。

稠密光流 的缺點在於計算量較大(機器好,任性的朋友可以忽略)。

opencv的稠密光流計算採用gunnar farnebak演算法,對應函式為calcopticalflowfarneback(),效果:

ok,主要的兩種光流法都講過了,如果不需要深入研究的話(偏工程的童鞋就喜歡這個,哈哈:)),應該夠了,看**吧:

#include #include "opencv2/video/tracking.hpp"

#include "opencv2/highgui/highgui.hpp"

#pragma comment(lib,"opencv_core2410.lib")

#pragma comment(lib,"opencv_highgui2410.lib")

#pragma comment(lib,"opencv_video2410d.lib")

#pragma comment(lib,"opencv_imgproc2410.lib")

#pragma comment(lib,"opencv_features2d2410.lib")

#define max_corners 1000

using namespace std;

using namespace cv;

int main(int argc, char* argv)

} imshow("farneback",imgs[0]);

cvwaitkey(1);

system("pause");

return 0;

}

機器學習實踐系列之15 OpenCV之MSER

最大穩定極值區域mser maximally stable extremal regions 是一種類似分水嶺的演算法,目前主要用於影象分割和車牌區域檢測。2012年由matas等人提出。mser基本原理是對一幅灰度影象 灰度值為0 255 取閾值進行二值化處理,閾值從0到255依次遞增。在得到的所...

機器學習實踐系列之8 人眼定位

一.人眼檢測 opencv自帶的人眼檢測,及教程都已比較普及,這裡不再囉嗦,訓練模板直接 load已經訓練好的檔案 haarcascade eye tree eyeglasses.xml,直接看 linolzhang 2014.10 基於opencv的人眼檢測 cascade include ope...

機器學習系列6 正規方程

求乙個函式的引數,例如下面這個方程,我們一般都會用梯度下降法去求。還會不會有其他方法求引數呢?答案是有的,可以用正規方程 normal equation 去求引數。那麼問題來了,什麼是正規方程呢?這個方程長什麼樣子,就讓我們來見識一下。其中 x 是乙個矩陣,這個矩陣的每一行都是一組特徵值,y 是資料...