『壹』 運動目標檢測——光流法與opencv代碼實現
運動目標的檢測的其主要目的是 獲取目標對象的運動參數(位置、速度、加速度等)及運動軌跡 ,通過進一步分析處理,實現對目標行為更高層級上的理解。
運動目標檢測技術目的是 從序列圖像中將變化區域從背景圖像中提取出來 ,常用於視頻監視、圖像壓縮、三維重構、異常檢測等。
運動目標檢測主流方法有幀差法、背景差法、光流法等。光流法源於 仿生學 思想,更貼近於直覺,大量昆蟲的視覺機理便是基於光流法。
二十世紀五十年代心理學家Gibson在他的著作「The Perception of Visual World」中首次提出了以心理學實驗為基礎的光流法基本概念,而直到八十年代才由Horn、Kanade、Lucash和Schunck創造性地將灰度與二維速度場相聯系,引入光流約束方程的演算法,對光流計算做了奠基性的工作。
光流(optical flow):由於目標對象或者攝像機的移動造成的圖像對象在連續兩幀圖像中的移動。
小球在連續五幀運動構成的光流 小球在連續五幀運動構成的光流通俗說,對於一個圖片序列,把每張圖像每個像素在連續幀之間的運動速度和方向( 某像素點在連續兩幀上的位移矢量 )找出來就是光流場。
第t幀的時A點的位置是(x1, y1),第t+1幀時A點位置是(x2,y2),則像素點A的位移矢量:(ux, vy) = (x2, y2) - (x1,y1)
如何知道第t+1幀的時候A點的位置涉及到不同的光流計算方法,主要有四種:基於梯度的方法、基於匹配的方法、基於能量的方法、基於相位的方法。
光流法依賴於三個假設:
根據所形成的光流場中 二維矢量的疏密程度 ,光流法可分為稠密光流與稀疏光流。
基於區域匹配生成的稠密光流場 基於區域匹配生成的稠密光流場 稀疏光流只對有 明顯特徵的組點 (如角點)進行跟蹤,計算開銷小。
http://www.opencv.org.cn/opencvdoc/2.3.2/html/moles/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowfarneback
(1)calcOpticalFlowPyrLK
基於金字塔LK光流演算法,計算某些點集的稀疏光流。
參考論文《Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm》
(2)calcOpticalFlowFarneback
基於Gunnar Farneback 的演算法計算稠密光流。
參考論文《Two-Frame Motion Estimation Based on PolynomialExpansion》
(3)CalcOpticalFlowBM
通過塊匹配的方法來計算光流
(4)CalcOpticalFlowHS
基於Horn-Schunck 的演算法計算稠密光流。
參考論文《Determining Optical Flow》
(5)calcOpticalFlowSF
論文《SimpleFlow: A Non-iterative, Sublinear Optical FlowAlgo》的實現
『貳』 求大神解釋下matlab程序,關於運動目標檢測的
function vu = get_mask()//定義函數VU
bg = imread('tu\\131.jpg');//讀入圖片131.jpg
bg = rgb2gray(bg);//將圖片轉換為灰度圖像
bg = im2bw(bg, graythresh(bg));//再轉換為二值圖,閾內值是對灰度圖像用最大類間容方差法得到的
Img = imread('tu\\1.jpg');//讀入圖片1.JPG
I = rgb2gray(Img);//轉換為灰度圖
I = im2bw(I, graythresh(I));//轉換為二值圖
bw = I;//
L = bwlabel(I);//從黑背景甄別白塊,返回和I相同大小的圖像L
stats = regionprops(L, 'Area');//統計被標記白塊的區域的總面積
Ar = cat(1, stats.Area);//按列連接矩陣
[mr, ind] = max(Ar);//找到Ar中那些最大值的索引位置,將他們放在向量ind中
I(L~=ind) = 0;//I中L與ind不相等的位置賦值為零
vu = imfill(I, 'holes');//將原圖填充孔洞
『叄』 運動目標檢測 高斯混合模型 matlab
--------------------------------------------------------------------------
% 基於中位數演算法的運動目標檢測
% 第1種實現方法
%--------------------------------------------------------------------------
%*******************************讀取視頻數據********************************
% 調用aviread函數讀取視頻文件
vid = aviread('WalkingMan.avi')
size(vid(1).cdata) % 查看第1幀的大小,也是每一幀的大小
vid(1).colormap % 查看第1幀的colormap值
%*****************************數據類型的轉換********************************
% 把vid的cdata欄位的取值轉換成一個240×360×3×80的四維數組IM
IM = cat(4,vid.cdata);
size(IM) % 查看IM的大小
[m,n,k,h] = size(IM); % 把IM的大小賦給四個變數
% 把IM轉換成一個80行,240×360×3列的矩陣
I = reshape(IM,[m*n*k,h])';
%********************調用median函數求中位數,進行視頻圖像分割****************
I = median(I); % 求I矩陣中各列元素的中位數
I = reshape(I,[m,n,k]); % 將向量I轉成240×360×3的三維數組,得到背景圖像
figure; % 新建一個圖形窗口
imshow(I); % 顯示背景圖像
figure; % 新建一個圖形窗口
imshow(IM(:,:,:,1) - I); % 顯示第1幀中的目標圖像
%--------------------------------------------------------------------------
% 基於中位數演算法的運動目標檢測
% 第1種實現方法
%--------------------------------------------------------------------------
% 調用mmreader函數創建讀取視頻文件的多媒體閱讀對象WalkManObj
WalkManObj = mmreader('WalkingMan.avi');
% 根據多媒體閱讀對象WalkManObj,讀取視頻的各幀圖像數據
IM = read(WalkManObj, [1, inf]);
[m,n,k,h] = size(IM); % 把IM的大小賦給四個變數
% 把IM轉換成一個80行,240×360×3列的矩陣
I = reshape(IM,[m*n*k,h])';
I = median(I); % 求I矩陣中各列元素的中位數
I = reshape(I,[m,n,k]); % 將向量I轉成240×360×3的三維數組,得到背景圖像
figure; % 新建一個圖形窗口
imshow(I); % 顯示背景圖像
figure; % 新建一個圖形窗口
imshow(IM(:,:,:,1) - I); % 顯示第1幀中的目標圖像