1. 程式人生 > >低秩矩陣的應用--背景建模

低秩矩陣的應用--背景建模

背景建模是從拍攝的視訊中分離出背景和前景。

由於背景的視訊基本是不變的,所以如果把每幀當做一個矩陣的一列那麼,矩陣是低秩的,所以低秩矩陣的恢復來恢復出背景。

今天主要完成了,在自己的資料庫讓進行背景和前景的分離。下面為主要步驟:

1.從馬毅的實驗室網址下載RPCA求解的程式碼http://perception.csl.illinois.edu/matrix-rank/introduction.html

2.給出的介面是[A_hat E_hat iter] = inexact_alm_rpca(D, lambda, tol, maxIter)

所以明確目標:D是我們的視訊中的每一幀,A_hat 是我們估計的背景,E_hat是前景。

RPCA解決的問題是


clc;
clear;

%% this to read avi by using mmread to get every frame
video = VideoReader('E:\FFOutput\test.avi');
nFrames = video.NumberOfFrames;   %得到幀數
H = video.Height;     %得到高度
W = video.Width;      %得到寬度
Rate = video.FrameRate;
Cal_FrameN=300;
% Preallocate movie structure.
mov(1:Cal_FrameN) = struct('cdata',zeros(H,W,3,'uint8'),'colormap',[]);


%read one frame every time
for i = 1:Cal_FrameN
    mov(i).cdata = read(video,i);
    P = mov(i).cdata;
    double_P=im2double(P);
    %imshow( double_P),title('原始圖片3');
    Frame=rgb2gray( double_P);%當前灰度幀
    %下采樣
    Down_Frame=Frame(2:4:H,2:4:W);
    M(:, i) = Down_Frame(:);
   %  disp('當前播幀數:'),disp(i);
    % imshow(P),title('原始圖片');
     

%     P2=rgb2gray(P);

 
end
 
[A_hat, E_hat, iter]=inexact_alm_rpca(M,0.006);
A=reshape(A_hat(:,200), size(Down_Frame));
E=reshape(E_hat(:,200), size(Down_Frame));
D_real=reshape(M(:,200), size(Down_Frame));
figure;
imshow(D_real),title('原始圖片');
figure;
imshow(A),title('恢復圖片');
figure;
imshow(abs(E)),title('錯誤圖片');


因為是MATLAB的初學者所以遇到了兩個問題:

A.必須對讀取的影象做double_P=im2double(P);處理不然會出現

錯誤使用  * 
MTIMES 不完全支援整數類。至少有一個輸入必須為標量。
要按元素進行 TIMES 計算,請改用 TIMES (.*)。


出錯 lanbpro (line 298)
      r = At*U(:,1);


出錯 lansvd (line 209)
    [U,B,V,p,ierr,w] = lanbpro(A,j,p,options,U,B,V,anorm);


出錯 inexact_alm_rpca (line 53)
norm_two = lansvd(Y, 1, 'L');


出錯 background (line 36)
[A_hat, E_hat, iter]=inexact_alm_rpca(M,0.006);

B在顯示錯誤圖片時需要做abs絕對值處理,不然是全黑的圖片,不能看到前景影象。

C.最後一個也非常重要lumada值為1/(根號m).m為一張圖片畫素點的個數

D還有一個問題就是原圖片很到,直接做會有記憶體不夠的問題,所以進行了下采樣。

實驗結果:

=+