function dummy=transformation_gd_victor_fn(path_im_ref,nomg,nomd,num)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   Appariement de deux images - G. Besnard
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

nbpoints = 100; % nombre de points qu'on veut cliquer
%choix    = 0; %%% 0 : cliquer les points, 1 : faire seulement la transformation sur un set de points d�j� cliqu�s
%path_im_ref      = '/usrtmp/mathieu/GDR/Benchmark_exp_2/depl_mire_sinus/'; % Endroit o� sont les images
%nomg     = 'mire_sinus-0000_0';
%nomd     = 'mire_sinus-0000_1';
correc   = 2;  %1 rigide, 2 affine et 3 parabolique
save1     = 1;

%%%%%%%%%%%%%%%%%%%%%%%%%%%


img = double(imread(sprintf('%s%s.tif',path_im_ref,nomg))); % Image de r�f�rence
imd = double(imread(sprintf('%s%s.tif',path_im_ref,nomd))); % Image � corriger
imdd = imd;
imcor = sprintf('%scor',nomd); % Nom de l'image corrig�e pour sauvegarde
D = 100;
dec = 10;
%%%%%%%%%%%%%%%%%%%%%%%%


% valeurs utiles par la suite
[haut long epaisseur] = size(img);
[m n] = meshgrid(1:long,1:haut);
pt = 1;

%%% Partie utile des images %%%
if size(img,3)>1
    img=img(:,:,2);
    imd=imd(:,:,2);
    imdd=imdd(:,:,2);
end  

cx21g=zeros(nbpoints,1);
cy21g=zeros(nbpoints,1);
cx21g(1,1)=NaN;
cy21g(1,1)=NaN;
cx21d=zeros(nbpoints,1);
cy21d=zeros(nbpoints,1);
cx21d(1,1)=NaN;
cy21d(1,1)=NaN;

termine = 0;

while termine == 0
    % on affiche l'image de gauche et on clique un point
    figure('position',[1 1 1800 1800]);
    colormap(gray);
    if pt <=2
        imagesc(img);
        axis image
        % pour les deux premiers clics, on veut etre tres precis car
        % l'erreur se repercuterai sur les autres
        [aaa,bbb] = ginput(1);
	    axis([aaa-D aaa+D bbb-D bbb+D])
        [cx21g(pt),cy21g(pt)] = ginput(1);
    else
        % on affiche une image modifiee pour eviter de choisir des points
        % qui ne sont que sur une seule image
        imgmod = img;
        imgmod(isnan(imdtrans2)) = NaN;
        imagesc(imgmod);
        axis image
        [cx21g(pt),cy21g(pt)] = ginput(1);
    end
    hold on;
    plot(cx21g(pt),cy21g(pt),'+r','markersize',13,'linewidth',2);
    hold off;
    % on laisse affiché et ce point arrive avec une croix

    % Nouvelle figure avec l'image de droite
    figure('position',[1 1 1800 1800]);
    colormap(gray);
    if pt <= 2;
        imagesc(imd);
        axis image;
        %on veut etre precis sur les deux premiers
        [aaa,bbb] = ginput(1);
	    axis([aaa-D aaa+D bbb-D bbb+D])
        [cx21d(pt),cy21d(pt)] = ginput(1);
    else
        imagesc(imdtrans2);
        axis image;
        [cx21d_prov,cy21d_prov] = ginput(1);
        % il faut ramener les valeurs provisoires dans le bon repere
        % en effet, ce sont des donnes en pixels dans le repere de l'image
        % deplacee, il faut revenir en pixels dans le repere de l'image
        % d'origine
        cx21d(pt) = (cx21d_prov-xbardef)*co+(cy21d_prov-ybardef)*si+xbarref;
        cy21d(pt) = -(cx21d_prov-xbardef)*si+(cy21d_prov-ybardef)*co+ybarref;
        
    end
   
    close all

    % on a donc deux points, maintenant on transforme l'image avec
    % seulement ces points là pour que les points d'apres soient plus 
    % faciles a trouver, et que l'on visualise l'erreur 
    xg = cx21g(1:pt,1);
    yg = cy21g(1:pt,1);
    xd = cx21d(1:pt,1);
    yd = cy21d(1:pt,1);
    

    if pt == 1
        % les deux premiers coups, transformations rigides pour
        % la visualisation uniquement
        %%% avec un point on ne fait rien
    elseif pt == 2
        % Au second coup, on calcule l'image deformee que l'on va utiliser
        [M2,N2,co,si,xbarref,ybarref,xbardef,ybardef]=transformation_image_victor(xg,yg,xd,yd,img,imd,pt,1);
        imdtrans2 = interp2(m,n,imdd,M2,N2);
        imdtrans = imdtrans2;
    else
        % les autres coups on garde la visualisation mais on fait la vrai
        % transformation
        [M2,N2,A,B,C,D,E,F]=transformation_image_victor(xg,yg,xd,yd,img,imd,pt,correc); 
        imdtrans = interp2(m,n,imdd,M2,N2);
    end
    
    if pt>=2
        dep_long=M2-m;
        dep_haut=N2-n;

        figure('units','normalized','outerposition',[0 0 1 1])

        subplot(222)
        rvb = uint16(img);
        rvb(:,:,2)=uint16(imdtrans);
        rvb(:,:,3)=uint16(zeros(size(imdtrans)));
        image(rvb);
        hold on
        plot(cx21d,cy21d,'+r','markersize',10,'linewidth',2)


        subplot(224)
        imagesc(imdtrans)
        hold on
        plot(cx21g,cy21g,'+r','markersize',10,'linewidth',2)
        colormap(gray)

        subplot(221)
        imagesc(img)
        hold on
        plot(cx21g,cy21g,'+r','markersize',10,'linewidth',2)

        subplot(223)
        imagesc(img-imdtrans)
    end
    
    % on verifie que l'on a bien fait les choses
    question = questdlg('Voulez vous garder le dernier point ?', ...
	'Point OK ?', ...
	'Oui','Non','J ai fini','Oui');
    switch question
        case 'Oui'
            disp('Point valide')
            pt = pt+1;
        case 'Non'
            disp('Point non valide')
            pt = pt-1;
            if pt == 0
                pt = 1;
            end
        case 'J ai fini'
            disp('Procedure de calibrage terminée')
            termine = 1;
    end 
end

if save1 == 1
    imwrite(uint8(imdtrans),sprintf('%s%s.tif',path_im_ref,imcor),'tif');
    save(sprintf('%sdeplongi_%02g.mat',path_im_ref,num),'dep_long')
    save(sprintf('%sdeptrans_%02g.mat',path_im_ref,num),'dep_haut')

    %%sauvegarde des points dans un fichier texte%%
    fid = fopen(sprintf('points_transformation_gd_%02g.txt',num),'wt');
    for ni=1:pt
        fprintf(fid,'%8.3f %8.3f %8.3f %8.3f\n',cx21g(ni),cy21g(ni),cx21d(ni),cy21d(ni));
    end
    fclose(fid);

    disp('Fichiers enregistrés')
else
    disp('Pas d enregistrement')
end

dummy=1;
