% Funkce pro registraci libovolné sekvence s optimalizací BA
% vstup - sekvence, počet průzkumnic, nejelpších průzkumnic,
% elitních,vyčkávajících,okolí, max. počet iterací
%výstup - registovaná sekvence, vektor MSE, čas registrace
%příklad spuštění: [registrovana_sek,MSE,t]=registrace_BA(sekvence,20,10,5,3,1,20)

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

if (nargin) ~= 7
    msgbox('Může trvat věčnost, opravdu vypustit včely ?', 'warn','warn');
    disp('Bylo Vám vybráno nastavení a včelky se rojí')
        n_pruzkumnic=100;
        m_best_pruzkumnic=30;
        elita=15;
        vyck=20;
        ngh=1;
        maxit=100;
else
    disp('Jak si přejete, včelky se rojí')
        n_pruzkumnic=varargin{1};
        m_best_pruzkumnic=varargin{2};
        elita=varargin{3};
        vyck=varargin{4};
        ngh=varargin{5};
        maxit=varargin{6};
end


%% 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] = BA_MSE(sekvence{ref},obr,n_pruzkumnic,m_best_pruzkumnic,elita,vyck,ngh,maxit,okno);
    %[gbest_fit,vystup] = BA_MSE(sekvence{ref},obr,n_pruzkumnic,m_best_pruzkumnic,elita,vyck,ngh,maxit,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