% Funkce pro registraci libovolné sekvence s optimalizací PSO
% vstup - sekvence, počet částic, max počet iterací, max. hodnota na x, c1,
% c2, W
%výstup - registovaná sekvence, vektor MSE, čas registrace
%příklad spuštění: [registrovana_sek,MSE,t]=registrace_PSO(sekvence,10,10,10,1,1,0.6)

function [registrovana_sek,MSE,t]=registrace_PSO(sekvence,varargin)

if (nargin) ~= 7
    disp('Bylo Vám vybráno nastavení a částice se rojí')
        n_jedincu=100;
        maxit=200;
        xmax=10;
        c1=2;
        c2=1;
        W=0.6;
else
    disp('Jak si přejete, částice se rojí')
        n_jedincu=varargin{1};
        maxit=varargin{2};
        xmax=varargin{3};
        c1=varargin{4};
        c2=varargin{5};
        W=varargin{6};
end
%n_jedincu,maxit,xmax,c1,c2,W
%% volba okna
obr1=sekvence{1};
imshow(obr1)
title('Tažením myši vyberte obdélníkovou oblast pro registraci')
h=imrect()
pos = h.getPosition();
pos_rect = round(pos);
okno=[pos_rect(2),pos_rect(2)+pos_rect(4),pos_rect(1),pos_rect(1)+pos_rect(3)];
close;
%%
ref=1;
OUTPUT2=zeros(length(sekvence),3);
MSE=zeros(length(sekvence),1);
registrovana_sek=sekvence;
tic; t=[]; %okno=[100,200,90,330];
h = waitbar(0,'Prosím, čekejte...');
for i=2:length(sekvence)
    obr=sekvence{i};
    [vystup,gbest_fit] = PSO_MSE(sekvence{ref},obr,n_jedincu,maxit,xmax,c1,c2,W,okno);
    tmp=imtranslate(obr,vystup(1:2));
    registrovana_sek{i}=imrotate(tmp,vystup(3),'bilinear','crop');
    OUTPUT2(i,1:3)=vystup;
    OUTPUT2(i,4)=gbest_fit;%
    MSE(i)=immse(sekvence{ref}(okno(1):okno(2),okno(3):okno(4)),registrovana_sek{i}(okno(1):okno(2),okno(3):okno(4))); 
    toc;
    t=[t, toc];
     waitbar((i) / length(sekvence))
end
close(h)
end