function [img pocet FP pocetFP matchedFP files detect_time matching_time] = start_reg (PathToFolder, TypeOfImage, TypeOfDetector, MatchingTechnique )
% START - spustacia a hlavna funkcia registracie obrazov
% 
% Na zaklade zadanych parametrov funkcia spocita vyznacne body v sekvencii
% obrazov, vypocita korespondujuce pary v susednych obrazoch a podla
% poziadavkov zadane body a ich vzajomne korespondencie vykresli. 
% Postupnost sekvencie musi byt jasne definovana pomocou poradovych cisel
% snimkov v nazve suboru. Napriklad:
% image001.jpg, image002.jpg ... image 999.jpg
% 
% start_reg (PathToFolder, TypeOfImage, TypeOfDetector, MatchingTechnique,
%            PlotingType, WaitbarToggle)
% 
% PathToFolder - Definovanie zlozky, v ktorej su umiestnene subory, 
% je nutne zadat bud ako cestu od zlozky, v ktorej sa nachadza 
% subor start.m napriklad:
% '..\test_IMG'
% alebo v tvare uplnej cesty napriklad:
% 'C:\Matlab\Registration\test_IMG'
% 
% TypeOfImage - definovanie typu suboru obrazu je nutne zadat 
% v tvare '.***' kde *** znaci priponu suboru napriklad:
% '.bmp', '.jpg', '.png', '.tif' ...
% 
% TypeOfDetector - definovanie typy detektora ktory bude pouzity:
% 'harris'  - Harris detektor vyznacnych bodov
% 'ST'      - Shi-Thomasi detektor vyznacnych bodov
% 'FAST'    - Detekcia vyznacnych bodov pomocou
%             Features from Accelerated Segment Test
% 'entropy' - Detekcia vyznacnych bodov pomocou entropie v obraze
% 
% MatchingTechnique - definovanie techniky parovania vyznacnych bodov 
% 'euclid'  - priradovanie parov na zaklade najmensej euklidovej
%             vzdialenosti
% 'LACC'    - priradovanie parov na zaklade vypoctu Lokalneho korelacneho 
%             koeficientu (Local Area Correlation Coeficient)
% 
% PlotingType - Definovanie ako a ci budu vykreslovane vyznacne body.
%               Doba vykreslenia jedneho snimku animacie je 1 sekunda
% 'off'       - Ziadne vykreslovanie
% 'FP'        - Vykresli sa originalny obraz a vedla neho obraz 
%               s vyznacenim vyznacnych bodov 
% 'matched'   - Vykresli sa vzdy dvojica po sebe nasledujucich obrazov 
%               s naznacenim sparovanych bodov. 
% 'shift'     - Vykreslenie ako sa posunuli sparovane FB v danom obraze 
%               oproti predoslemu obrazu.
% 'FPMatched' - Vykresli sa dvojica obrazov spolu s vyznacnymi bodmi 
%               a obraz kde su sparovane body prepojene



    %% Inicializacny subor - co treba dorobit!!!
    % Dorobit este feature matching metody
   
    
    %% Globálne vstupne premenné
    path = PathToFolder;            % Cesta k súborom od adresára kde je umiestnený spúšťací súbor
    file_type = TypeOfImage;        % Typ súborov ktorý má byť načítaný 
    FPdetector = TypeOfDetector;    % Typu detektora ktory bude pouzity podla vstupu funkcie
    ProgressBar = 'on';             % Definovanie stavu progress barov 'on' / 'off'
%     PointPloting = 'off';     % Definovanie ako sa budu vykreslovat FP
    Matching = MatchingTechnique;   % Definovanie techniky parovania
    
    % Hodnoty globalnych vstupnych premennych pre testovanie dalsich funkcii. 
    % Treba odkomentovat tieto pre testovanie a zakomentovat vstup z
    % funkcie
    
%     path = '..\test_IMG';     % Cesta k súborom od adresára kde je umiestnený spúšťací súbor
%     file_type = '.tif';       % Typ súborov ktorý má byť načítaný 
%     FPdetector = 'harris';    % Typu detektora ktory bude pouzity podla vstupu funkcie
%     ProgressBar = 'off';      % Definovanie stavu progress barov
%     PointPloting = 'off';     % Definovanie ako sa budu vykreslovat FP
%     Matching = 'euclid';      % Definovanie techniky parovania

    %% Nacitanie suborov do premennej pomocou funkcie img_load
    
%     tic
    [img pocet files] = img_load(path, file_type);
%     time = toc;
    
%     fprintf('Pocet nacitanych obrazov: %d \n' , pocet);
%     fprintf('Celkovy cas:%6.3f sekund \n' ,time);
%     clear time;

    
    %% Definovanie Progress bar pre detekciu FP
    if strcmp( ProgressBar, 'on' )
        
        if FPdetector == 1
            PB = waitbar(0,'Detekcia FP - Harris detektor');
        
        elseif FPdetector == 2
            PB = waitbar(0,'Detekcia FP - ST detektor');
        
        elseif FPdetector == 3
            PB = waitbar(0,'Detekcia FP - FAST detektor');
        
        elseif FPdetector == 4
            PB = waitbar(0,'Detekcia FP - Entropia bodov');
        
        end
        
    end
    
    
    %% Detekcia FP
    
    % Definovanie prazdnych globalnych premennych pre detekciu FP
    
    FP{pocet} = 0;  % Rezervacia miesta v pamati pre FP v obrazoch
    pocetFP = zeros(1,pocet);   % Rezervacia miesta v pamati pre pocty FP 
%     I(size(img,1),size(img,2)) = zeros;     % Vytvorenie prazdnej matice I kvoli rychlosti
    detect_time(pocet) = 0;   
    
    switch  FPdetector
        case 1
            for i=1:pocet
                
                tic
                I = img(:,:,i);
                [FP_temp pocetFP_temp] =  harris (I);
                FP{i} = FP_temp;
                pocetFP(i) = pocetFP_temp;
                
                if strcmp ( ProgressBar, 'on' )
                    waitbar(i/pocet);
                end
                detect_time(i) = toc;
            end
            
            clear FP_temp pocetFP_temp;
            
        case 2
            % Premenne pre Shi-Thomasi detector
            ST_pocet = 100;

            for i=1:pocet
                tic
                I = img(:,:,i);
                [FP_temp pocetFP_temp ] =  ST_detect (I, ST_pocet);
                FP{i} = FP_temp;
                pocetFP(i) = pocetFP_temp;
                
                if strcmp ( ProgressBar, 'on' )
                    waitbar(i/pocet);
                end
                detect_time(i) = toc;
            
            end

            clear FP_temp pocetFP_temp;
            
        case 3
            prah = 120;      
            % cim mensi prah tym viacej detekovanych FP a naopak
            % Optimalne 100 skuskami
            
            for i=1:pocet
                
                tic
                I = double(img(:,:,i));
                FP_temp1 = fast9 (I, prah);
               
                FP_temp = zeros(size(FP_temp1,1),2);
               
                FP_temp(:,1) = FP_temp1(:,2); 
                FP_temp(:,2) = FP_temp1(:,1); 
               
               
                FP{i} = FP_temp;
                pocetFP(i) = size(FP_temp,1);
                clear FP_temp1;
                
                if strcmp ( ProgressBar, 'on' )
                    waitbar(i/pocet);
                end
                detect_time(i) = toc;
                
            end
            clear FP_temp FP_temp1 pocetFP_temp;
            
        case 4
            % definovanie radiusu masky pre vypocet lokalnej entropie ak
            % nebude definovany nastavi sa radius = 10
            radius = 5; 
            
            for i=1:pocet
                
                tic
                I = img(:,:,i);
                [FP_temp] = local_entropy (I,radius);
                FP{i} = FP_temp;
                pocetFP(i) = size(FP_temp,1);
                
                if strcmp ( ProgressBar, 'on' )
                    waitbar(i/pocet);
                end
                detect_time(i) = toc;
            end
            clear FP_temp ;
            
    end
    
    if strcmp( ProgressBar, 'on' )
       close(PB);
       
       
    end
            
    
      %% Definovanie Progress bar pre FP matching
    if strcmp( ProgressBar, 'on' )
        
        if Matching == 1
            PB = waitbar(0,'Parovanie FP - Euclid');
        
        elseif Matching == 2
            PB = waitbar(0,'Parovanie FP - LACC');
            
        elseif Matching == 3
            PB = waitbar(0,'Parovanie FP - LACC s obmedzením vzdialenosti');
        
        end
        
    end
      
    %% Parovanie vyznacnych bodov - Feature matching
   
    % definicia premennych pred FP matching
    matchedFP = cell(1,pocet-1);
    matching_time = 0;
    
    switch Matching
        case 1
            % Euklidovska vzdialenost
            for i=1:(pocet-1)
                tic
                FP1 = FP {i};
                FP2 = FP {i+1};
                [matchedFP_temp] = match_FP_distance (FP1, FP2);
                matchedFP{i} = matchedFP_temp;
                
                if strcmp ( ProgressBar, 'on' )
                    waitbar(i/pocet);
                end
                matching_time(i) = toc;
            end
            clear FP1 FP2 matchedFP_temp;
            
            
        case 2
            % Lokalny korelacny koeficient
            Nhood = 5;
            for i=1:(pocet-1)
                tic
                FP1 = FP {i};
                FP2 = FP {i+1};
                [matchedFP_temp] = match_LACC (img(:,:,i),img(:,:,i+1),FP1, FP2, Nhood);
                matchedFP{i} = matchedFP_temp;
                
                if strcmp ( ProgressBar, 'on' )
                    waitbar(i/pocet);
                end
                matching_time(i) = toc;
            end

            clear FP1 FP2 matchedFP_temp;
            
        case 3
            % Lokalny korelacny koeficient s obmedzenim vzdialenosti
            max_distance = 50; %  maximalnu vzdialenost pixelov
            Nhood = 5;
            
            for i=1:(pocet-1)
                tic
                FP1 = FP {i};
                FP2 = FP {i+1};
                [matchedFP_temp] = LACC_distance_matching (img(:,:,i),img(:,:,i+1),FP1, FP2, Nhood, max_distance);
                matchedFP{i} = matchedFP_temp;
                
                if strcmp ( ProgressBar, 'on' )
                    waitbar(i/pocet);
                end
                matching_time(i) = toc;
            end
            
            clear FP1 FP2 matchedFP_temp;
            
        
    end

    if strcmp( ProgressBar, 'on' )
       close(PB) 
       
    end
    
    
    %% Vykreslovanie
    
%     switch PointPloting
%         case 2
%             figure(1);
%             
%             for i=1:pocet
%                 subplot(1,2,1)
%                 imshow(img(:,:,i));
%                 subplot(1,2,2)
%                 imshow(img(:,:,i));
%                 hold on
%                 scatter(FP{i}(:,2),FP{i}(:,1),'r');
%                 hold off
%                 pause(1);
%             end
%            
%         case 3
%             figure(1);
%             
%             img_matched(size(img,1),((size(img,2))*2)) = zeros;
%             
%             for i = 1:size(matchedFP,2)
%                 img_matched(:,1:(size(img,2))) = img(:,:,i);
%                 img_matched(:,((size(img,2))+1):size(img_matched,2)) = img(:,:,i+1);
%                 imshow(img_matched,[]);
%                 hold on;
%                 matchedFP_show = matchedFP{i};
% 
%                 for j = 1:size(matchedFP_show,1)
%                     a = [ matchedFP_show(j,2), (matchedFP_show(j,4)+(size(img,2))) ];
%                     b = [ matchedFP_show(j,1), matchedFP_show(j,3) ];
%                     plot(a,b,'r+-');
%                     hold on
%                 end
% 
%                 hold off;
%                 pause(1);
%             end
%             
%         case 4
%             figure(1);
%             
%             for i = 1:size(matchedFP,2)
%                 matchedFP_show = matchedFP{i};
%                 imshow(img(:,:,i),[]);
%                 hold on;
%                 
%                 for j = 1:size(matchedFP_show,1)
%                     a = [ matchedFP_show(j,2), matchedFP_show(j,4) ];
%                     b = [ matchedFP_show(j,1), matchedFP_show(j,3) ];
%                     plot(a,b,'r');
%                     hold on
%                 end
%                 hold off;
%                 pause(1);
%             end
%             
%         case 5
%             figure(1);
%     
%             img_matched(size(img,1),((size(img,2))*2)) = zeros;
% 
%             for i = 1:size(matchedFP,2)
%                 
%                 subplot(2,2,1);
%                 imshow(img(:,:,i));
%                 
%                 subplot(2,2,2);
%                 imshow(img(:,:,i+1));
%                 
%                 subplot(2,2,3:4);
%                 img_matched(:,1:(size(img,2))) = img(:,:,i);
%                 img_matched(:,((size(img,2))+1):size(img_matched,2)) = img(:,:,i+1);
% 
%                 imshow(img_matched,[]);
%                 hold on;
% 
%                 matchedFP_show = matchedFP{i};
% 
%                 for j = 1:size(matchedFP_show,1)
% 
%                     a = [ matchedFP_show(j,2), (matchedFP_show(j,4)+(size(img,2))) ];
%                     b = [ matchedFP_show(j,1), matchedFP_show(j,3) ];
% 
%                     plot(a,b,'r+-');
%                     hold on
% 
%                 end
% 
%                 hold off;
%                 pause(1);
% 
%             end
%             
%         case 1
%             
%     end
    

end
  
