function [Result,ResDev,R] = DistortionRemove(DLTresult)

%Funkce ma za ucel nalezt presne vnitrni parametry kamery, s tim ze
%nelinearni parametry jsou znamy, zaroven jsou vystupem korigovane
%souradnice ref. znacek ve snimcich

options = optimoptions(@lsqnonlin,'MaxIter',10,'TolFun',10^(-20),'TolX',10^(-20),'Display','off');%,'FiniteDifferenceType','central'
                                                                            %nastaveni resice - centralni num. derivace, vypnuti zobrazeni, limity nastaveny tak, aby bylo provedeno 10 iteraci
%NACTENI POTREBNYCH PROMENNYCH
                                                                            
global ijk                                                                  %cislo cyklu (1. nebo 2. fotka)
global xcorCell                                                             %korigovane souradnice znacek ve snimku                                                            
global ycorCell
global xCell                                                                %nekorigovane souradnice znacek ve snimku
global yCell
global XCell                                                                %souradnice kal. znacvek v prostoru
global YCell
global ZCell
global DETG                                                                 %vyrovnavaci znamenko u matic rotace
global K1G                                                                  %nelinearni parametry kamery
global K2G
global K3G
global P1G
global P2G
global C1G
global C2G

Vx = DLTresult(2);                                                          %poloha kamery v globalnim s. s.
Vy = DLTresult(3);
Vz = DLTresult(4);

Omega = DLTresult(5);                                                       %rotace s. s. kamery v globalnim s. s.
Fi = DLTresult(6);
Kapa = DLTresult(7);

Px = DLTresult(8);                                                          %souradnice principalniho bodu ve snimku
Py = DLTresult(9);

Cxy = (DLTresult(10)+DLTresult(11))/2;                                      %ohniskova vzdalenost

%ITERACNI VYPOCET

for j = 1:10                                                                %10 cyklu, jestli algoritmus nenarazi na terminacni podminku uvedenou na konci
    
    b0 = [Vx,Vy,Vz,Omega,Fi,Kapa,Px,Py,Cxy];                                %vektor pocatecnich hodnot (z DLT) - toto jsou zde nezname parametry
    
    [CameraParams,rz(j)] = lsqnonlin(@CorrectionStereo,b0,[],[],options);   %reseni metodou nelinearnich nejmensich ctvercu, ve smyslu distribuce chyby mezi nezname parametry
    
    Vx = CameraParams(1);                                                   %ziskane parametry
    Vy = CameraParams(2);
    Vz = CameraParams(3);
    
    Omega = CameraParams(4);
    Fi = CameraParams(5);
    Kapa = CameraParams(6);
    
    dPx = CameraParams(7)-b0(7);
    dPy = CameraParams(8)-b0(8);
    
    Px = CameraParams(7);
    Py = CameraParams(8);
    
    Cxy = CameraParams(9);
    
    r = sqrt((xcorCell{ijk}-dPx).^2+(ycorCell{ijk}-dPy).^2);                %korigovana vzdalenost danych bodu od stredu snimku - principalniho bodu
    
    dx = (xcorCell{ijk}-dPx).*K1G(ijk).*r.^2+(xcorCell{ijk}-dPx).*K2G(ijk)/10^6.*r.^4+(xcorCell{ijk}-dPx).*K3G(ijk)/10^12.*r.^6+P1G(ijk).*(r.^2+2*(xcorCell{ijk}-dPx).^2)+2.*P2G(ijk).*(xcorCell{ijk}-dPx).*(ycorCell{ijk}-dPy)+C1G(ijk).*(xcorCell{ijk}-dPx)+C2G(ijk).*(ycorCell{ijk}-dPy);
    dy = (ycorCell{ijk}-dPy).*K1G(ijk).*r.^2+(ycorCell{ijk}-dPy).*K2G(ijk)/10^6.*r.^4+(ycorCell{ijk}-dPy).*K3G(ijk)/10^12.*r.^6+2.*P1G(ijk).*(xcorCell{ijk}-dPx).*(ycorCell{ijk}-dPy)+P2G(ijk).*(r.^2+2*(ycorCell{ijk}-dPy).^2);
                                                                            %korekce ve smeru osy x a y
    xcorCell{ijk} = xCell{ijk}-dx-Px;                                       %vypocet korigovanych souradnic
    ycorCell{ijk} = yCell{ijk}-dy-Py;
    
    control = zeros(size(xCell{ijk},1),6);                                  %priprava matice s korigovanymi souradnicemi pro rekalkulaci
    control(:,2) = XCell{ijk};
    control(:,3) = YCell{ijk};
    control(:,4) = ZCell{ijk};
    control(:,5) = xcorCell{ijk};
    control(:,6) = ycorCell{ijk};
    
    Result1 = [0;Vx;Vy;Vz;Omega;Fi;Kapa;0;0;Cxy;Cxy];                       %priprava parametru kamery pro rekalkulaci
    R = DETG(ijk)*RotMat(Omega,Fi,Kapa);
    
    ResDev = DLT_Recalc(Result1,R,control);                                 %chyba rekalkulace v jednotlivych krocich
    
    if (j>3 && rz(j-1)-rz(j)>0.001)                                         %terminacni podminka - minimalne 3 kroky, pokud je rozdil sum nejmensich ctvercu v po sobe jdoucich krocich mensi nez dana mez, cely cyklus vypoctu je ukoncen
        break 
    end
    
end

Result = [0;Vx;Vy;Vz;Omega;Fi;Kapa;Px;Py;Cxy;Cxy];                          %vektor vyslednych parametru 

end

