%*-------------------demo_ASIFT MATLAB interface   -------------------------*/
% 
% *************************************************************************
% NOTE: The ASIFT SOFTWARE ./demo_ASIFT IS STANDALONE AND CAN BE EXECUTED
%       WITHOUT MATLAB. 
% *************************************************************************
% 
% Detect corresponding points in two images with the ASIFT method. 
% Copyright, Jean-Michel Morel, Guoshen Yu, 2008. 
% Please report bugs and/or send comments to Guoshen Yu yu@cmap.polytechnique.fr
%
% Reference: J.M. Morel and G.Yu, ASIFT: A New Framework for Fully Affine Invariant Image 
%           Comparison, SIAM Journal on Imaging Sciences, vol. 2, issue 2, pp. 438-469, 2009. 
% Reference: ASIFT online demo (You can try ASIFT with your own images online.) 
% http://www.ipol.im/pub/algo/my_affine_sift/
%
% 2010.08.17
% ---------------------------------------------------------------------------*/

function demo_ASIFT(file_img1, file_img2, imgOutVert, imgOutHori, matchings, keys1, keys2, flag_resize)

if (nargin == 8) 
    if (isnumeric(flag_resize) && (flag_resize == 0))
        flag_resize = 0;
    else
        flag_resize = 1;
    end
elseif (nargin == 7)
    flag_resize = 1;
else
    disp('*******************************************************************************');
    disp('***************************  ASIFT image matching  ****************************');
    disp('*******************************************************************************');
    disp('Usage: ./demo_ASIFT imgIn1 imgIn2 imgOutVert.png imgOutHori.png');
    disp('          matchings.txt keys1.txt keys2.txt [Resize option: 0/1]'); 
    disp('- imgIn1, imgIn2: input images (in most standard formats).');
    disp('- imgOutVert.png, imgOutHori.png: output images (vertical/horizontal concatenated,');
    disp('  in PNG format.) The detected matchings are connected by write lines.');
    disp('- matchings.txt: coordinates of matched points (col1, row1, col2, row2).'); 
    disp('- keys1.txt keys2.txt: ASIFT keypoints of the two images.')
    disp('- [optional 0/1]. 1: input images resize to 800x600 (default). 0: no resize.'); 
    disp('*******************************************************************************'); 
    disp('*********************  Jean-Michel Morel, Guoshen Yu, 2010 ********************'); 
    disp('*******************************************************************************'); 
    assert(false);
end

imgIn1 = imread(file_img1);
imgIn2 = imread(file_img2);

% convert the image to png format 
file_img1_png = 'tmpASIFTinput1.png';
file_img2_png = 'tmpASIFTinput2.png';
imwrite(imgIn1, file_img1_png, 'png');
imwrite(imgIn2, file_img2_png, 'png');

% get the number of processors 
% Mac
if (ismac == 1)
    [s, w] = unix('sysctl -n hw.ncpu');
    num_CPUs = str2num(w);
    % set the maximum OpenMP threads to the number of processors 
    set_threads = sprintf('export OMP_NUM_THREADS=%d;', num_CPUs);
     
    % ASIFT command
    command_ASIFT = './demo_ASIFT'; 
    
    command_ASIFT = [command_ASIFT ' ' file_img1_png ' ' file_img2_png ' ' ...
    imgOutVert ' ' imgOutHori ' ' matchings ' ' keys1 ' ' keys2];

    if (flag_resize == 0)
        command_ASIFT = [command_ASIFT ' 0'];
    end
    
    command = [set_threads ' ' command_ASIFT];

% Unix    
elseif (isunix == 1)
    [s, w] = unix('grep processor /proc/cpuinfo | wc -l');
     num_CPUs = str2num(w);
    % set the maximum OpenMP threads to the number of processors 
    set_threads = sprintf('export OMP_NUM_THREADS=%d;', num_CPUs);
    
    % ASIFT command
    command_ASIFT = './demo_ASIFT'; 
    
    command_ASIFT = [command_ASIFT ' ' file_img1_png ' ' file_img2_png ' ' ...
    imgOutVert ' ' imgOutHori ' ' matchings ' ' keys1 ' ' keys2];

    if (flag_resize == 0)
        command_ASIFT = [command_ASIFT ' 0'];
    end
    
    command = [set_threads ' ' command_ASIFT];
% Windows    
elseif (ispc == 1)
    [s, w] = dos('set NUMBER_OF_PROCESSORS');
    num_CPUs = sscanf(w, '%*21c%d', [1, Inf]);
    % set the maximum OpenMP threads to the number of processors 
    setenv('OMP_NUM_THREADS', num2str(num_CPUs));
    
    % ASIFT command
    command_ASIFT = 'demo_ASIFT'; 
    
    command_ASIFT = [command_ASIFT ' ' file_img1_png ' ' file_img2_png ' ' ...
    imgOutVert ' ' imgOutHori ' ' matchings ' ' keys1 ' ' keys2];

    if (flag_resize == 0)
        command_ASIFT = [command_ASIFT ' 0'];
    end
    
    command = command_ASIFT;
else
    error('Unrecognized operating system. The operating system should be Windows, Linux/Unix, or Mac OS.');
end


status = system(command);
