我需要在matlab中执行背景减法。 我有一个短视频,一个男人从右到左穿过墙,所以这是一个简单而稳定的视频。
我了解了一种使用时间中位数来估算背景的方法:我们需要采用一些帧窗口(比方说 - 25帧),并且随着时间的推移执行中值 以便我们可以得到“中值图像”应该是对BG的良好估计(在那种视频中,对于足够大的窗口,关于BG像素的BG,移动物体的存在应该可以忽略不计)。一旦我们进行了BG估计,我们就可以从帧等中减去它。
我的问题是:
编辑:我正在使用的视频与“分类数据库”下的here非常相似 - > “行走”。
K = 31; % window size
half_win = (K+1)/2;
thresh = 0.7; % threshold for the subtraction
reader = VideoReader('input.avi');
writer = VideoWriter('bianry.avi');
open(writer);
window = cell(1,K);
% handling first frame
[h,~,~] = rgb2hsv(im2single(readFrame(reader)));
window{half_win} = h;
k = 1;
% mirror padding of frames
while hasFrame(reader)
if k == half_win
break
end
[h,~,~] = rgb2hsv(im2single(readFrame(reader)));
window{half_win + k} = h;
window{half_win - k} = h;
k = k + 1;
end
n = ndims(window{1});
bg = median(cat(n+1, window{:}), n+1);
fg = abs( window{half_win} - bg ) > thresh;
writeVideo(writer, im2uint8(fg));
while hasFrame(reader)
[h,~,~] = rgb2hsv(im2single(readFrame(reader)));
% update window
window(1:K-1) = window(2:K);
window{K} = h;
bg = median(cat(n+1, window{:}), n+1);
fg = abs( window{half_win} - bg ) > thresh;
writeVideo(writer, im2uint8(fg));
end
% mirror padding for the end of the video
ind = K-1;
for k=1:(half_win - 1)
frame_to_mirror = window{ind};
window(1:K-1) = window(2:K);
window{K} = frame_to_mirror;
bg = median(cat(n+1, window{:}), n+1);
fg = abs( window{half_win} - bg ) > thresh;
writeVideo(writer, im2uint8(fg));
ind = ind -2;
end
close(writer);