% SUM-MAX MAPS FOR TEMPLATE MATCHING INFERENCE
%% load in learned template, set parameter values
clear all; 
load 'learnedTemplate'; % load in the learned template
mex Cfind.c;   % compile C code for template matching inference
mex Cmax1.c; 
%% load in test image, generate multiple resolutions
numResolution = 10;  % total number of resolutions to search 
allSizex = zeros(1, numResolution); allSizey = zeros(1, numResolution); 
imageFolder = 'testImage'; % folder of training images  
imageName = dir([imageFolder '/*.jpg']);
numImage = size(imageName, 1); % number of training images 
for (ii = 1 : numImage)
    close all; 
    tmpIm = imread([imageFolder '/' imageName(ii).name]); 
    pic = tmpIm; 
    if size(tmpIm,3) == 3
        tmpIm = rgb2gray(tmpIm);
    end
J0 = single(tmpIm); 
MAX1maps = cell(numResolution, numOrient); 
SUM2map = cell(1, numResolution); 
for(img=1:numResolution)
    J{img} = imresize(J0, .10+(img-1)*.1, 'nearest');  % scaled images
    [sizex, sizey] = size(J{img}); 
    allSizex(img) = sizex; allSizey(img) = sizey; % sizes of images at multiple resolutions
    sizexSubsample = floor(sizex/subsample); sizeySubsample = floor(sizey/subsample); 
    SUM2map{img} = single(zeros(sizexSubsample, sizeySubsample));  % log-likelihood score maps for testing images
    for (orient=1:numOrient)
        MAX1map{img, orient} = single(zeros(sizexSubsample, sizeySubsample)); 
    end
    translatedTemplate{img} = single(zeros(sizex, sizey));  % symbolic sketch on testing image
end
%% compute SUM1 maps for all resolutions
disp(['start filtering']); tic
SUM1map = ApplyFilterfft(J, allFilter, localHalfx, localHalfy, thresholdFactor);   % filter testing image at all resolutions
disp(['filtering time: ' num2str(toc) ' seconds']);
MAX2score = single(zeros(1, numResolution));  % maximum log-likelihood score at each resolution
%% detect the object and superpose template
disp(['start maxing']); tic
Cmax1(numResolution, allSizex, allSizey, numOrient, ...
      locationShiftLimit, orientShiftLimit, subsample, saturation,  ...
      SUM1map, MAX1map);
disp(['maxing time: ' num2str(toc) ' seconds']);
MMAX2 = -1e10; 
for (a = 1:numAspect) 
   disp(['start finding']); tic; 
   Cfind(numResolution, allSizex, allSizey, numOrient, ...
      locationShiftLimit, orientShiftLimit, subsample, saturation,  ...
      halfFilterSize, SUM1map, allSymbol(1, :), ...
      numElement, allSelectedOrient(a, :), allSelectedx(a, :), allSelectedy(a, :), selectedlambda, selectedLogZ, ...
      MAX1map, SUM2map, translatedTemplate, MAX2score);
disp(['mex-C finding time: ' num2str(toc) ' seconds']);
%% display results
[maxOverResolution ind] = max(MAX2score);   % most likely resolution
if (MMAX2 < maxOverResolution) 
    MMAX2 = maxOverResolution; Ma = a; 
end
end
   a = Ma; allAspect(a)
   tic; 
   Cfind(numResolution, allSizex, allSizey, numOrient, ...
      locationShiftLimit, orientShiftLimit, subsample, saturation,  ...
      halfFilterSize, SUM1map, allSymbol(1, :), ...
      numElement, allSelectedOrient(a, :), allSelectedx(a, :), allSelectedy(a, :), selectedlambda, selectedLogZ, ...
      MAX1map, SUM2map, translatedTemplate, MAX2score);
  [maxOverResolution ind] = max(MAX2score); 
disp(['mex-C finding time: ' num2str(toc) ' seconds']);
showImage;
saveas(gcf, [outputFolder 'eps/testoriginal' num2str(100+ii) '.eps'], 'epsc');
saveas(gcf, [outputFolder 'png/testoriginal' num2str(100+ii) '.png'], 'png');
pic = double(J{ind}+translatedTemplate{ind}*100); showImage;
saveas(gcf, [outputFolder 'eps/testsketch' num2str(100+ii) '.eps'], 'eps');
saveas(gcf, [outputFolder 'png/testsketch' num2str(100+ii) '.png'], 'png');
if (0)
figure('Position', [1 1 1024 768]); 
mesh(double(SUM2map{ind})); % log-likelihood score map at optimal resolution
saveas(gcf, 'ex2_1_S2','eps');
figure; plot(MAX2score); 
title('MAX2 score vs resolution'); xlabel('resolution'); ylabel('MAX2');
saveas(gcf, 'ex2_1_M2','eps');
end
end
fid = fopen([outputFolder '.html'], 'at'); 
   outMessage =  ['==> Number of testing images = ' num2str(numImage) ...
                          '<br>'];
    fprintf(fid, '%s\n', outMessage);
    disp(outMessage);           
%% write the html code for reproducibility page

heightstr = '"height=160> '; 
counter = 0; 
for (ii = 1 : numImage)
 fprintf(fid, '%s\n', ['<IMG SRC="' outputFolder 'png/testoriginal' num2str(100+ii) '.png' heightstr]);
 fprintf(fid, '%s\n', ['<IMG SRC="' outputFolder 'png/testsketch' num2str(100+ii) '.png' heightstr]);
 counter = counter + 1; 
 if (counter == 3)
     fprintf(fid, '%s\n', ['<br>']);
     counter = 0; 
 end
end
    fprintf(fid, '%s\n', ['<hr>']);
    fclose(fid);



