function [Eul] = Mat2Eul(R)

%Prevedeni matice rotace na uhly - matice rotace vznika rotacemi okolo os
%x, y, z v tomto poradi. 
%pozn. - uhly nejsou jendoznacne - strategie je vypocet matice rotace ze
%vsech moznych kombinaci a porovnani s puvodni matici rotace

Omega1 = atan(-R(2,3)/R(3,3));                                              % uhel natoceni kolem osy x
Omega2 = Omega1 + pi;

Fi1 = asin(R(1,3));                                                         % uhel natoceni kolem osy y
Fi2 = pi-Fi1;

Kapa1 = atan(-R(1,2)/R(1,1));                                               % uhel natoceni kolem osy z
Kapa2 = Kapa1 + pi;

r111 = cos(Fi1).*cos(Kapa1);
r121 = -cos(Fi1).*sin(Kapa1);
r131 = sin(Fi1);
r211 = cos(Omega1).*sin(Kapa1)+sin(Omega1).*sin(Fi1).*cos(Kapa1);
r221 = cos(Omega1).*cos(Kapa1)-sin(Omega1).*sin(Fi1).*sin(Kapa1);
r231 = -sin(Omega1).*cos(Fi1);
r311 = sin(Omega1).*sin(Kapa1)-cos(Omega1).*sin(Fi1).*cos(Kapa1);
r321 = sin(Omega1).*cos(Kapa1)+cos(Omega1).*sin(Fi1).*sin(Kapa1);
r331 = cos(Omega1).*cos(Fi1);

R1 = [r111,r121,r131;r211,r221,r231;r311,r321,r331];

r112 = cos(Fi1).*cos(Kapa1);
r122 = -cos(Fi1).*sin(Kapa1);
r132 = sin(Fi1);
r212 = cos(Omega2).*sin(Kapa1)+sin(Omega2).*sin(Fi1).*cos(Kapa1);
r222 = cos(Omega2).*cos(Kapa1)-sin(Omega2).*sin(Fi1).*sin(Kapa1);
r232 = -sin(Omega2).*cos(Fi1);
r312 = sin(Omega2).*sin(Kapa1)-cos(Omega2).*sin(Fi1).*cos(Kapa1);
r322 = sin(Omega2).*cos(Kapa1)+cos(Omega2).*sin(Fi1).*sin(Kapa1);
r332 = cos(Omega2).*cos(Fi1);

R2 = [r112,r122,r132;r212,r222,r232;r312,r322,r332];

r113 = cos(Fi1).*cos(Kapa2);
r123 = -cos(Fi1).*sin(Kapa2);
r133 = sin(Fi1);
r213 = cos(Omega2).*sin(Kapa2)+sin(Omega2).*sin(Fi1).*cos(Kapa2);
r223 = cos(Omega2).*cos(Kapa2)-sin(Omega2).*sin(Fi1).*sin(Kapa2);
r233 = -sin(Omega2).*cos(Fi1);
r313 = sin(Omega2).*sin(Kapa2)-cos(Omega2).*sin(Fi1).*cos(Kapa2);
r323 = sin(Omega2).*cos(Kapa2)+cos(Omega2).*sin(Fi1).*sin(Kapa2);
r333 = cos(Omega2).*cos(Fi1);

R3 = [r113,r123,r133;r213,r223,r233;r313,r323,r333];

r114 = cos(Fi2).*cos(Kapa2);
r124 = -cos(Fi2).*sin(Kapa2);
r134 = sin(Fi2);
r214 = cos(Omega2).*sin(Kapa2)+sin(Omega2).*sin(Fi2).*cos(Kapa2);
r224 = cos(Omega2).*cos(Kapa2)-sin(Omega2).*sin(Fi2).*sin(Kapa2);
r234 = -sin(Omega2).*cos(Fi2);
r314 = sin(Omega2).*sin(Kapa2)-cos(Omega2).*sin(Fi2).*cos(Kapa2);
r324 = sin(Omega2).*cos(Kapa2)+cos(Omega2).*sin(Fi2).*sin(Kapa2);
r334 = cos(Omega2).*cos(Fi2);

R4 = [r114,r124,r134;r214,r224,r234;r314,r324,r334];

r115 = cos(Fi1).*cos(Kapa2);
r125 = -cos(Fi1).*sin(Kapa2);
r135 = sin(Fi1);
r215 = cos(Omega1).*sin(Kapa2)+sin(Omega1).*sin(Fi1).*cos(Kapa2);
r225 = cos(Omega1).*cos(Kapa2)-sin(Omega1).*sin(Fi1).*sin(Kapa2);
r235 = -sin(Omega1).*cos(Fi1);
r315 = sin(Omega1).*sin(Kapa2)-cos(Omega1).*sin(Fi1).*cos(Kapa2);
r325 = sin(Omega1).*cos(Kapa2)+cos(Omega1).*sin(Fi1).*sin(Kapa2);
r335 = cos(Omega1).*cos(Fi1);

R5 = [r115,r125,r135;r215,r225,r235;r315,r325,r335];

r116 = cos(Fi2).*cos(Kapa1);
r126 = -cos(Fi2).*sin(Kapa1);
r136 = sin(Fi2);
r216 = cos(Omega1).*sin(Kapa1)+sin(Omega1).*sin(Fi2).*cos(Kapa1);
r226 = cos(Omega1).*cos(Kapa1)-sin(Omega1).*sin(Fi2).*sin(Kapa1);
r236 = -sin(Omega1).*cos(Fi2);
r316 = sin(Omega1).*sin(Kapa1)-cos(Omega1).*sin(Fi2).*cos(Kapa1);
r326 = sin(Omega1).*cos(Kapa1)+cos(Omega1).*sin(Fi2).*sin(Kapa1);
r336 = cos(Omega1).*cos(Fi2);

R6 = [r116,r126,r136;r216,r226,r236;r316,r326,r336];

r117 = cos(Fi2).*cos(Kapa2);
r127 = -cos(Fi2).*sin(Kapa2);
r137 = sin(Fi2);
r217 = cos(Omega1).*sin(Kapa2)+sin(Omega1).*sin(Fi2).*cos(Kapa2);
r227 = cos(Omega1).*cos(Kapa2)-sin(Omega1).*sin(Fi2).*sin(Kapa2);
r237 = -sin(Omega1).*cos(Fi2);
r317 = sin(Omega1).*sin(Kapa2)-cos(Omega1).*sin(Fi2).*cos(Kapa2);
r327 = sin(Omega1).*cos(Kapa2)+cos(Omega1).*sin(Fi2).*sin(Kapa2);
r337 = cos(Omega1).*cos(Fi2);

R7 = [r117,r127,r137;r217,r227,r237;r317,r327,r337];

r118 = cos(Fi2).*cos(Kapa1);
r128 = -cos(Fi2).*sin(Kapa1);
r138 = sin(Fi2);
r218 = cos(Omega2).*sin(Kapa1)+sin(Omega2).*sin(Fi2).*cos(Kapa1);
r228 = cos(Omega2).*cos(Kapa1)-sin(Omega2).*sin(Fi2).*sin(Kapa1);
r238 = -sin(Omega2).*cos(Fi2);
r318 = sin(Omega2).*sin(Kapa1)-cos(Omega2).*sin(Fi2).*cos(Kapa1);
r328 = sin(Omega2).*cos(Kapa1)+cos(Omega2).*sin(Fi2).*sin(Kapa1);
r338 = cos(Omega2).*cos(Fi2);

R8 = [r118,r128,r138;r218,r228,r238;r318,r328,r338];

corrs = [sum(sum(abs(R1-R)));sum(sum(abs(R2-R)));sum(sum(abs(R3-R)));sum(sum(abs(R4-R)));sum(sum(abs(R5-R)));sum(sum(abs(R6-R)));sum(sum(abs(R7-R)));sum(sum(abs(R8-R)))];
                                                                            %odchylka kazde zrekonstruovane matice rotace od matice puvodni
corrmin = min(corrs);                                                       %jako uhly rotace s. s. kamery jsou ulozeny uhly, z nichz je tvorena matice rotace s nejmensi odchylkou od vypocitane DLT

if corrs(1)==corrmin
    
    Omega = Omega1;
    Fi = Fi1;
    Kapa = Kapa1;
    
elseif corrs(2)==corrmin
    
    Omega = Omega2;
    Fi = Fi1;
    Kapa = Kapa1;

elseif corrs(3)==corrmin
    
    Omega = Omega2;
    Fi = Fi1;
    Kapa = Kapa2;

elseif corrs(4)==corrmin
    
    Omega = Omega2;
    Fi = Fi2;
    Kapa = Kapa2;
    
elseif corrs(5)==corrmin
    
    Omega = Omega1;
    Fi = Fi1;
    Kapa = Kapa2;
    
elseif corrs(6)==corrmin
    
    Omega = Omega1;
    Fi = Fi2;
    Kapa = Kapa1;
    
elseif corrs(7)==corrmin
    
    Omega = Omega1;
    Fi = Fi2;
    Kapa = Kapa2;
    
elseif corrs(8)==corrmin
    
    Omega = Omega2;
    Fi = Fi2;
    Kapa = Kapa1;
 
end

Eul = [Omega, Fi, Kapa];

end

