Azzera filtri
Azzera filtri

hi why does this code give me an error?

1 visualizzazione (ultimi 30 giorni)
clc
disp('Begin Foreground Extraction!');
v = VideoReader('test.avi');
video1 = read(v,[1 6]);
fg = extractForeground1(video1)
disp('Done!!');
function
function foreground = extractForeground1(video,frameSkip,dataRange,minSigmaLevel,shadowLevel,significanceThreshold,useGraph,graphAlpha,morphStructureElement,returnLargestComponent)
% extractForeground: Extract the foreground from a video.
%
% This file shows sample usage for extracting the moving foreground
% from a static background. It is intended as an example only;
% More sophisitcated background modeling techniques, particularly
% adaptive ones, may be applied instead. However, this should
% suffice for many simple videos.
%
% A number of parameters are available to control the behavior
% of the algorithm. If these are unsupplied or empty, reasonable
% default values will be chosen.
%
% video: This is the only required parameter. It may consist
% of a string containing the name of an avi file to load.
% Alternately, it may contain the video frames as a cell
% array of rgb images, stored as uint8 data.
%
% frameSkip: Long videos may use enormous amounts of memory
% during the intermediate processing stages. If this becomes
% a problem, frameSkip allows the background model to be
% computed using every nth frame.
%
% dataRange: A cheap way of approximating robust statistics.
% Mean/deviation are computed only for data falling within
% the specified percentile ranges. For example, with the
% default value of [.25 .75], outlier pixels in up to 25% of
% the video frames will be ignored.
%
% minSigmaLevel: Pixels with very low (or zero) deviation cause
% trouble. This parameter specifies a percentile level,
% which gives a floor deviation value for all pixels.
%
% shadowLevel: Amount of shadowing to account for. Positive
% values allow some darkening of the pixel intensity without
% treating it as evidence of a foreground object.
%
% significanceThreshold: Number of standard deviations required
% for a pixel to be considered foreground, in isolation.
% This is perhaps the single most important parameter. If pieces
% of the foreground are being left out, try decreasing its value.
% If too much background is included, try increasing its value.
% (Lax dataRange bounds can also cause pieces of foreground to be
% left out, if an object obscures the background for too long.
% Increasing the shadowLevel can also help prevent background
% inclusion, particularly around subjects' legs.)
%
% useGraph: Boolean control parameter. If true, use graph cut
% to find foreground. If false, use morphology.
%
% graphAlpha: Parameter controlling "clumpiness" of graph cut
% operation.
%
% morphStructureElement: Parameter controlling the morphological
% operations if these are used.
%
% returnLargestComponent: Boolean control parameter. If true,
% then return single largest connected foreground component.
% If false, return raw labels.
%
% Usage:
% function foreground = extractForeground(video,frameSkip,dataRange,minSigmaLevel,shadowLevel,significanceThreshold,useGraph,graphAlpha,morphStructureElement,returnLargestComponent)
% Apply default values if required
if (nargin < 2)|isempty(frameSkip), frameSkip = 1; end;
if (nargin < 3)|isempty(dataRange), dataRange = [.25 .75]; end;
if (nargin < 4)|isempty(minSigmaLevel), minSigmaLevel = 0.1; end;
if (nargin < 5)|isempty(shadowLevel), shadowLevel = 0.05; end;
if (nargin < 6)|isempty(significanceThreshold), significanceThreshold = 6; end;
if (nargin < 7)|isempty(useGraph), useGraph = 1; end;
if (nargin < 8)|isempty(graphAlpha), graphAlpha = 1; end;
if (nargin < 9)|isempty(morphStructureElement), morphStructureElement = strel('disk',1); end;
if (nargin < 10)|isempty(returnLargestComponent), returnLargestComponent = 1; end;
if ischar(video)
% Load the video from an avi file.
avi = VideoReader(video);
pixels = double(cat(4,avi(1:frameSkip:end).cdata))/255;
clear avi
else
% Compile the pixel data into a single array
pixels = double(cat(4,video{1:frameSkip:end}))/255;
clear video
end;
% NOTE: The result of the cat operation above may be very large.
% If it will not fit into memory, try increasing frameSkip.
% Another alternative is to decrease the video resolution.
% Convert to HSV color space.
nFrames = size(pixels,4);
for f = 1:nFrames
pixels(:,:,:,f) = rgb2hsv(pixels(:,:,:,f));
end;
% Generate Gaussian background model in hsv space for each pixel.
[backgroundMean, backgroundDeviation] = hsvGaussModel(pixels,dataRange);
backgroundDeviation(:,:,1) = max(backgroundDeviation(:,:,1),pctile(nonzeros(backgroundDeviation(:,:,1)),minSigmaLevel));
backgroundDeviation(:,:,2) = max(backgroundDeviation(:,:,2),pctile(nonzeros(backgroundDeviation(:,:,2)),minSigmaLevel));
backgroundDeviation(:,:,3) = max(backgroundDeviation(:,:,3),pctile(nonzeros(backgroundDeviation(:,:,3)),minSigmaLevel));
% Do frame-by-frame differencing
connections = pixCon(size(backgroundMean(:,:,1)));
foreground = cell(1,nFrames);
for f = 1:nFrames
% Find scaled deviation of this frame from background
deviation = sum(hsvCompare(pixels(:,:,:,f),backgroundMean,shadowLevel)./backgroundDeviation,3);
% Compare with threshold to generate labeling
if useGraph
% Use graph cuts
alpha = graphAlpha/significanceThreshold;
label = reshape(graphLabel(alpha*[max(2*significanceThreshold-deviation(:)',0);deviation(:)'],connections),size(deviation));
else
% Use morphological operations
label = double(imopen(imclose(deviation > significanceThreshold,morphStructureElement),morphStructureElement));
end;
% clean up: find largest connected component, etc.
if returnLargestComponent
label = fgRanked(label,1);
end;
foreground{f} = uint8(label); % Could use bwpack if desired
end;
% end of extractForeground
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Fits a gaussian to the specified distribution, in a robust manner.
%
% Returns the mean and standard deviation of the input arguments
% using the specified portion of the data. Uses HSV color space
% for better shadow control.
function [mu,sigma] = hsvGaussModel(pixels,dataRange)
% statistics of s & v dimensions are simple.
[mu(:,:,2:3),sigma(:,:,2:3)] = fitGauss(pixels(:,:,2:3,:),dataRange,4);
hmu = polarMean(pixels(:,:,1,:)*2*pi,4);
h = zeros(size(pixels(:,:,1,:)));
nFrames = size(pixels,4);
for i = 1:nFrames
h(:,:,1,i) = mod(pixels(:,:,1,i)*2*pi-hmu+pi,2*pi);
end;
[mu(:,:,1),sigma(:,:,1)] = fitGauss(h,dataRange,4);
mu(:,:,1) = mod(mu(:,:,1)-pi+hmu,2*pi)/(2*pi);
sigma(:,:,1) = sigma(:,:,1)/(2*pi);
% end of hsvGaussModel
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Fits a gaussian to the specified distribution, in a robust manner.
%
% Returns the mean and standard deviation of the input arguments
% using the specified portion of the data
function [mu,sigma] = fitGauss(m,dataRange,dim)
x = -3:0.01:3;
y = exp(-x.^2);
y = y./sum(y);
yy = cumsum(y);
fdev = sqrt(sum(y.*x.^2));
xbd = min(find(yy > dataRange(1))):min(find(yy > dataRange(2)));
pdev = sqrt(sum(y(xbd).*x(xbd).^2)/sum(y(xbd)));
dimlen = size(m,dim);
if all(dataRange == [0 1])|(dim > length(size(m)))
% skip sorting step if we'll be using everything anyway
ms = m;
else
ms = sort(m,dim);
end;
dimind = round(dataRange*(dimlen-1)+1);
[refstr{1:length(size(m))}] = deal(':');
if (dim <= length(size(m)))
refstr{dim} = dimind;
end;
sref = struct('type','()','subs',{refstr});
bds = subsref(ms,sref);
if (dim <= length(size(m)))
sref.subs{dim} = dimind(1):dimind(2);
end;
data = subsref(ms,sref);
mu = mean(data,dim);
sigma = std(data,0,dim)*fdev/pdev;
% end of fitGauss
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% function d = hsvCompare(a,b,shadow)
%
% Returns the component differences between images in HSV color space.
function d = hsvCompare(a,b,shadow)
aclr = length(a(:))/3;
bclr = length(b(:))/3;
sa = a(aclr+1:2*aclr);
sb = b(bclr+1:2*bclr);
va = a(2*aclr+1:3*aclr);
vb = b(2*bclr+1:3*bclr);
d = zeros(size(a));
d(1:aclr) = (angdiff(2*pi*a(1:aclr),2*pi*b(1:bclr)).*min(sa,sb))';
d(aclr+1:2*aclr) = abs(sa-sb);
d(2*aclr+1:3*aclr) = va-vb;
neg = find(d(2*aclr+1:3*aclr)<0);
d(2*aclr+neg) = max(0,vb(neg)-va(neg)-shadow);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%function d = angdiff(th1, th2)
%
% Returns the difference between angles expressed in radians.
% This will always be <= pi.
function d = angdiff(th1, th2)
d = abs(mod(th1-th2+pi,2*pi)-pi);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Returns the "mean" of a set of angular variables
function pm = polarMean(th,dim)
th = mod(th,2*pi);
x = cos(th);
y = sin(th);
if (nargin < 2)
pm = mod(atan2(mean(y),mean(x)),2*pi);
else
pm = mod(atan2(mean(y,dim),mean(x,dim)),2*pi);
end;
% end of polarMean
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PCTILE Percentile
%
% For vectors, PCTILE(X,Y) returns the element at the Yth percentile of X.
% For matrices, PCTILE(X,Y) returns a row vector containing the
% Yth percentile of each column. Y must be between 0 and 1.
%
% PCTILE(X,Y,DIM) takes the percentile along dimension DIM of X.
%
% See also MIN, MAX, MEDIAN
function pct = pctile(x,pct,dim)
if (nargin < 3)
[x,n] = shiftdim(x);
dim = 1;
end;
sx = sort(x,dim);
subs = cell(1,length(size(x)));
[subs{:}] = deal(':');
subs{dim} = round(pct*(size(x,dim)-1))+1;
ref = struct('type','()','subs',{subs});
pct = subsref(sx,ref);
if (nargin < 3)
pct = shiftdim(pct,-n);
end;
% end of pctile
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Returns the foreground connected component in the binary image
% supplied that have the specified ranked size(s).
function fgr = fgRanked(bin,rank)
fg = bwlabel(bin,4);
maxfg = max(fg(:));
h = hist(fg(find(bin)),[1:maxfg]);
[sh,sr] = sort(-h);
if (rank < 1)|(rank > max(find(sh > 0)))
fgr = zeros(size(img))
else
fgr = (fg==sr(rank));
end;
% end of fgranked
error i get
Error in extractForeground1 (line 83)
pixels = double(cat(4,video{1:frameSkip:end}))/255;

Risposta accettata

Walter Roberson
Walter Roberson il 25 Set 2015
The code expects the passed video to be a cell array. After your call
video1 = read(v,[1 6]);
add
video1 = mat2cell(video1, size(video1,1), size(video1,2), size(video1,3), ones(1,size(video1,4)) );
This will convert the 4 dimensional video1 array into a cell array of 3 dimensional frames that the routine wants.
  1 Commento
Rash Anan
Rash Anan il 25 Set 2015
Modificato: Walter Roberson il 25 Set 2015
thank you sir. it worked ..thank you very much :D :D

Accedi per commentare.

Più risposte (1)

Apoorv Lokhande
Apoorv Lokhande il 8 Giu 2016
Dear Walter,
I implemented the same code as given above by Rash. I also edited it with your suggestions. After that I face a problem,
Undefined function 'pixCon' for input arguments of type 'double'.
Error in extractForeground1 (line 97)
connections = pixCon(size(backgroundMean(:,:,1)));

Categorie

Scopri di più su Printing and Saving in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by