function [FP pocet_FP] = harris (I)
    % Harrisov detektor
    % Prevedie vypocet vyznacnych bodov ktore su ako vystup v premenej
    % Po odkomentovaní kódu na konci funkcie je možnosť tieto body rovno
    % zobrazit

    %% Premenne, nastavitelne parametre
    %pre volbu typu masky treba jednu odkomentovat a druhu zakomentovat
    
    dx = [-1 0 1; -1 0 1; -1 0 1];  % detekcna maska pre x osu Prewitt
%     dx = [-2 -1 0 1 2; -2 -1 0 1 2; -2 -1 0 1 2; -2 -1 0 1 2; -2 -1 0 1 2;];  % detekcna maska pre osu x Prewitt 5x5
%     dx = [-1 0 1; -2 0 2; -1 0 1];  % detekcná maska pre x osu Sobel; - nevyskusane
%     dx = [1  2 0  -2 -1; 4  8 0  -8 -4; 6 12 0 -12 -6; 4  8 0  -8 -4; 1  2 0  -2 -1]; % detekcna maska pre x osu Sobel  5x5
   
    r = 3; %definovanie polomeru okolia bodu.
    
    min_N = 150; %minimalne pocet detekovanych bodov
    max_N = 3000; %maximalny pocet detekovanych bodov
    
    %% nacitanie obrazu a vyber bodov
    img = I;
%     img = double(imread(I)); %nacitanie obrazu
%     img = double(imread('d2.jpg')); %nacitanie obrazu
    img_size = (size(img)); %zistenie rozmerov obrazu

   
    rmin = 1+r;               %vyber regionu z obrazu
    rmax = img_size(1)-r;
    cmin = 1+r;
    cmax = img_size(2)-r;

%     min_N = 150; %minimalne pocet detekovanych bodov
%     max_N = 3000; %maximalny pocet detekovanych bodov

    %% Vyhladavanie vyznacnych bodov

    sigma = 2;
    prah = 20;


    
    dy = dx'; % detekcna maska pre y osu
    
    % výpočet odozvy na detekcnu masku
    warning off
    imgX = conv2(img(rmin:rmax,cmin:cmax), dx, 'same'); %detekcia v X
    imgY = conv2(img(rmin:rmax,cmin:cmax), dy, 'same'); %detekcia v Y
    
    f = fspecial('gaussian',max(1,fix(6*sigma)), sigma); %Gaussov filter

    % vyhladenie filtrom - druhé derivácie
    imgX2 = conv2(imgX.^2, f, 'same');
    imgY2 = conv2(imgY.^2, f, 'same');
    imgXY = conv2(imgX.*imgY, f,'same');
    warning on

    
    %vypocet Harrisovych hodnot
    k = 0.0001; 
    Rx = (imgX2.*imgY2 - imgXY.^2) - k*(imgX2 + imgY2).^2; 
    Rx=(1000/max(max(Rx)))*Rx;
    R = Rx;

    okolie = 2*r+1;
    MX = ordfilt2(R,okolie^2,ones(okolie));
    Rx = (R==MX)&(R > prah);
    pocet=sum(sum(Rx(5:size(Rx,1)-5,5:size(Rx,2)-5)));

    i = 0;

    while (((pocet<min_N)||(pocet>max_N))&&(i<1000))
            if pocet>max_N
                prah=prah*1.5;
            elseif pocet < min_N
                prah=prah*0.5;
            end

            Rx = (R==MX)&(R>prah); 
            pocet=sum(sum(Rx(5:size(Rx,1)-5,5:size(Rx,2)-5)));
            i=i+1;
    end

    R=R*0;      %vynulovanie matice R
    R(5:size(Rx,1)-5,5:size(Rx,2)-5)=Rx(5:size(Rx,1)-5,5:size(Rx,2)-5);
    [r1,c1] = find(R);
    FP=[r1+cmin,c1+rmin];            % vyznacne body
    pocet_FP=size(FP,1);

%% Vykreslenie vyznacnych bodov do povodneho obrazu (stvorce 2x2)
%     
%    
%     for r=1: pocet_FP
%        img(FP(r,1)-2:FP(r,1)+2,FP(r,2)-2)=255;
%        img(FP(r,1)-2:FP(r,1)+2,FP(r,2)+2)=255;
%        img(FP(r,1)-2,FP(r,2)-2:FP(r,2)+2)=255;
%        img(FP(r,1)+2,FP(r,2)-2:FP(r,2)+2)=255;
% 
%     end
% 
%     imshow(uint8(img));
    
    
end


