Schiebefenstertechnik zur Erkennung mehrerer Personen
Ich arbeite an einer Videoüberwachungsanwendung zur Erkennung von Personen. Derzeit implementiere ich HOG-Deskriptor als Detektor. Ich habe jedoch ein Problem mit der Schiebefenstertechnik. Mein Code kann nur einzelne Personen erkennen. Ich verwende auch Gruppenrechtecke von MexOpen CV, um mehrere Begrenzungsrahmen zu erstellen. Hat jemand eine Idee, wie man eine Schiebefenstertechnik schreibt, um mehrere Objekte zu erkennen? Danke.
% 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