smilebluesky的专栏

背景建模是从拍摄的视频中分离出背景和前景。

由于背景的视频基本是不变的,所以如果把每帧当做一个矩阵的一列那么,矩阵是低秩的,所以低秩矩阵的恢复来恢复出背景。

今天主要完成了,,在自己的数据库让进行背景和前景的分离。下面为主要步骤:

1.从马毅的实验室网址下载RPCA求解的代码

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 framevideo = 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 timefor i = 1:Cal_FrameNmov(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还有一个问题就是原图片很到,直接做会有内存不够的问题,所以进行了下采样。

实验结果:

=

+

没有行李,没有背包,不带电脑更不要手机,

smilebluesky的专栏

相关文章:

你感兴趣的文章:

标签云: