técnica de ventana deslizante para detección de múltiples personas
Estoy trabajando en una aplicación de video vigilancia para detectar personas. Actualmente estoy implementando el descriptor HOG como detector. Sin embargo, tengo un problema con respecto a la técnica de ventana deslizante. Mi código solo puede detectar a una sola persona. Estoy usando también Rectángulos grupales de MexOpen CV para crear múltiples cuadros delimitadores. ¿Alguien tiene idea de cómo escribir la técnica de ventana deslizante para detectar múltiples objetos? Gracias.
% Reading the image
im = strcat ('C:\Users\Documents\MATLAB\HOG\HOG\images\16.bmp');
im = imread (im);
win_size= [64, 128];
[lastRightCol lastRightRow d] = size(im);
counter = 1;
%% Scan the window by using sliding window object detection
% this for loop scan the entire image and extract features for each sliding window
% Loop on scales (based on size of the window)
for s=1:0.5:3
disp(strcat('s is',num2str(s)));
X=win_size(1)*s;
Y=win_size(2)*s;
for y = 1:X/4:lastRightCol-Y
for x = 1:Y/4:lastRightRow-X
p1 = [x,y];
p2 = [x+(X-1), y+(Y-1)];
po = [p1; p2] ;
% Croped image and scan it.
crop_px = [po(1,1) po(2,1)];
crop_py = [po(1,2) po(2,2)];
topLeftRow = ceil(min(crop_px));
topLeftCol = ceil(min(crop_py));
bottomRightRow = ceil(max(crop_px));
bottomRightCol = ceil(max(crop_py));
cropedImage = img(topLeftCol:bottomRightCol,topLeftRow:bottomRightRow,:);
% Get the feature vector from croped image using HOG descriptor
featureVector{counter} = getHOGDescriptor(img);
boxPoint{counter} = [x,y,X,Y];
count = counter+1;
x = x+2;
end
end
end
label = ones(length(featureVector),1);
P = cell2mat(featureVector);
% each row of P' correspond to a window
% classifying each window
[~, predictions] = svmclassify(P', label,model);
% set the threshold for getting multiple detection
% the threshold value is 0.7
get_detect = predictions.*[predictions>0.6];
% the the value after sorted
[r,c,v]= find(get_detect);
%% Creating the bounding box for detection
for ix=1:length(r)
rects{ix}= boxPoint{r(ix)};
end
if (isempty(rects))
rects2=[];
else
rects2 = cv.groupRectangles(rects,3,'EPS',0.35);
end
for i = 1:numel(rects2)
rectangle('Position',[rects2{i}(1),rects2{i}(2),64,128], 'LineWidth',2,'EdgeColor','y');
end
end