主线程函数有:
load('INRIA/inriaperson_final');
addpath star-cascade
im1 = imread('test3.png');
im2 = imread('test2.png');
thresh = -0.5;
pca = 5;
% orig_model = model;
csc_model = cascade_model(model, '2007', pca, thresh);
pyra1 = featpyramid(double(im1), csc_model);
pyra2 = featpyramid(double(im2), csc_model);
[dCSC1, bCSC1] = cascade_detect(pyra1, csc_model, csc_model.thresh);
[dCSC2, bCSC2] = cascade_detect(pyra2, csc_model, csc_model.thresh);
boxes1 = getboxes(csc_model, im1, dCSC1, bCSC1);
boxes2 = getboxes(csc_model, im2, dCSC1, bCSC1);
featureim1 = cell(1,8);
featureim2 = cell(1,8);
numfilters = 10;
n = 1;
for i = numfilters:-1:1
% n = 1;
x1 = boxes1(:,1+(i-1)*4);
y1 = boxes1(:,2+(i-1)*4);
x2 = boxes1(:,3+(i-1)*4);
y2 = boxes1(:,4+(i-1)*4);
% remove unused filters
del = find(((x1 == 0) .* (x2 == 0) .* (y1 == 0) .* (y2 == 0)) == 1);
x1(del) = [];
x2(del) = [];
y1(del) = [];
y2(del) = [];
if i == 2
continue;
end
if i == 1
continue;
end
temp = imcrop(im1,[x1 y1 x2-x1 y2-y1]);
temp = rgb2gray(temp);
TextFeature=statxture(temp);
% featureim1 = cell(8)
featureim1{1,n} = TextFeature;
n = n+1;
end
n = 1;
for i = numfilters:-1:1
% n = 1;
x1 = boxes2(:,1+(i-1)*4);
y1 = boxes2(:,2+(i-1)*4);
x2 = boxes2(:,3+(i-1)*4);
y2 = boxes2(:,4+(i-1)*4);
% remove unused filters
del = find(((x1 == 0) .* (x2 == 0) .* (y1 == 0) .* (y2 == 0)) == 1);
x1(del) = [];
x2(del) = [];
y1(del) = [];
y2(del) = [];
if i == 2
continue;
end
if i == 1
continue;
end
temp = imcrop(im2,[x1 y1 x2-x1 y2-y1]);
temp = rgb2gray(temp);
TextFeature=statxture(temp);
% featureim2 = cell(8);
featureim2{1,n} = TextFeature;
n = n+1;
end
for k = 1:1:8
feature1 = featureim1{1,k};
feature2 = featureim2{1,k};
distance = (feature1-feature2)*(feature1-feature2)';
DisResult(k) = distance;
end
figure;
showboxes2(im2, boxes2);
figure;
showboxes2(im1, boxes1);
k = 1;
for i = numfilters:-1:1
% n = 1;
x1 = boxes2(:,1+(i-1)*4);
y1 = boxes2(:,2+(i-1)*4);
x2 = boxes2(:,3+(i-1)*4);
y2 = boxes2(:,4+(i-1)*4);
% % remove unused filters
% del = find(((x1 == 0) .* (x2 == 0) .* (y1 == 0) .* (y2 == 0)) == 1);
% x1(del) = [];
% x2(del) = [];
% y1(del) = [];
% y2(del) = [];
if i == 2
continue;
end
if i == 1
continue;
end
string = int2str(DisResult(k));
k = k+1;
x = round(x1+(x2-x1)/2);
y = round(y1+(y2-y1)/2);
% text(x,y,string);
text('Position',[x,y],'string',string,'color','r')
end
用到的函数有:
function b = getboxes(model, image, det, all)
b = [];
if ~isempty(det)
try
% attempt to use bounding box prediction, if available
bboxpred = model.bboxpred;
[det all] = clipboxes(image, det, all);
[det all] = bboxpred_get(bboxpred, det, all);
catch
warning('no bounding box predictor found');
end
[det all] = clipboxes(image, det, all);
I = nms(det, 0.5);
det = det(I,:);
all = all(I,:);
b = [det(:,1:4) all];
end
end
还有:
function showboxes2(im, boxes, out)
% showboxes(im, boxes, out)
% Draw bounding boxes on top of image.
% If out is given, a pdf of the image is generated (requires export_fig).
if nargin > 2
% different settings for producing pdfs
print = true;
wwidth = 2.25;
cwidth = 1.25;
imsz = size(im);
% resize so that the image is 300 pixels per inch
% and 1.2 inches tall
scale = 1.2 / (imsz(1)/300);
im = imresize(im, scale, 'method', 'cubic');
%f = fspecial('gaussian', [3 3], 0.5);
%im = imfilter(im, f);
boxes = (boxes-1)*scale+1;
else
print = false;
cwidth = 2;
end
% image(im);
imshow(im);
if print
truesize(gcf);
end
axis image;
axis off;
set(gcf, 'Color', 'white');
if ~isempty(boxes)
numfilters = floor(size(boxes, 2)/4);
if print
% if printing, increase the contrast around the boxes
% by printing a white box under each color box
for i = 1:numfilters
x1 = boxes(:,1+(i-1)*4);
y1 = boxes(:,2+(i-1)*4);
x2 = boxes(:,3+(i-1)*4);
y2 = boxes(:,4+(i-1)*4);
% remove unused filters
del = find(((x1 == 0) .* (x2 == 0) .* (y1 == 0) .* (y2 == 0)) == 1);
x1(del) = [];
x2(del) = [];
y1(del) = [];
y2(del) = [];
if i == 1
w = wwidth;
else
w = wwidth;
end
line([x1 x1 x2 x2 x1]', [y1 y2 y2 y1 y1]', 'color', 'w', 'linewidth', w);
end
end
% draw the boxes with the detection window on top (reverse order)
for i = numfilters:-1:1
x1 = boxes(:,1+(i-1)*4);
y1 = boxes(:,2+(i-1)*4);
x2 = boxes(:,3+(i-1)*4);
y2 = boxes(:,4+(i-1)*4);
% remove unused filters
del = find(((x1 == 0) .* (x2 == 0) .* (y1 == 0) .* (y2 == 0)) == 1);
x1(del) = [];
x2(del) = [];
y1(del) = [];
y2(del) = [];
if i == 2
continue;
end
if i == 1
c = [160/255 0 0];
s = '-';
else
c = 'b';
s = '-';
end
line([x1 x1 x2 x2 x1]', [y1 y2 y2 y1 y1]', 'color', c, 'linewidth', cwidth, 'linestyle', s);
end
end
% save to pdf
if print
% requires export_fig from http://www.mathworks.com/matlabcentral/fileexchange/23629-exportfig
export_fig([out]);
end
end
还有就是上一篇的纹理特征了。