www.pudn.com > calibr8.zip > getTR3.m
function [T, R, errs] = getTR3( Ip, Sp, DLT, Fl, u0, v0, b1, b2 ) %DEVELOPMENT PHASE % % function [T, R] = getTR3( Ip, Sp, DLT, Fl, u0, v0, b1, b2 ) % % decomposes the 3x3 CDLT matrix using fmins (4 params... rotation, z0) % %returns % T - translation matrix % R - rotation matrix % errs - difference between the original CDLT matrix and matrix composed of the decomposed parameters % %parametres % Ip - image coordinates % DLT - 3x3 CDLT matrix % Fl - focal length % u0, v0 - coordinates of the principal point % b1, b2 - linear distortion coefficients global GDLT; global GIp; global GSp; global GInt; global Gerrs; Gerrs = [-1]; GDLT= DLT; GIp = Ip; GSp = Sp; GInt = inv([1,0,-u0;0,1,-v0;0,0,1]) * inv([1+b1,b2,0;b2,1-b1,0;0,0,1]) * [Fl,0,0;0,Fl,0;0,0,1]; [Te, Re] = getTR( DLT, Fl, u0, v0, b1, b2, Sp(:,1:2) ); % prevod normaly na sfericke souradnice Vnorm = cross( Re(:,1)', Re(:,2)' ); [a1, b1] = dirangles( Vnorm ); % vypocet uhlu natoceni kolmych vektoru okolo normaly NR = dir2rot( Vnorm ); v1 = NR * Re(:,1); v1 = v1 / vsize(v1); % vezmu uhel prvniho - druhy dostanu prictenim pi/2 Fi = acos( v1( 1,1 ) ); if( v1(2,1) < 0 ) Fi = 2 * pi - Fi; end X0 = [(a1 / 180) * pi; (b1 / 180) * pi; Fi; Te( 3, 3 )]; %options = 1; % getTR_fun( X0 ) options(2) = 0.001; options(3) = 0.0001; X0 = solvopt( X0, 'getTRZ_fun', '', options ); [r c] = size( Gerrs ); [n11, n12, n13] = sph2cart( X0(1,1), X0(2,1), 1 ); Fi1 = X0(3,1); Fi2 = Fi1 + pi/2; NR = dir2rot( [n11, n12, n13] ); v11 = cos( Fi1 ); v12 = sin( Fi1 ); v21 = cos( Fi2 ); v22 = sin( Fi2 ); ne1 = (NR') * [v11;v12;0]; ne2 = (NR') * [v21;v22;0]; ne1 = ne1 / vsize( ne1 ); ne2 = ne2 / vsize( ne2 ); ne3 = cross( ne1, ne2 ); ne3 = ne3 / vsize( ne3 ); z0 = X0(4,1); [n m] = size( Sp ); Q = GInt * [ne1, ne2, ne3]; imgP = inv(Q) * hext(GIp)'; imgP = hnorm( imgP' ); x0 = sum( (imgP(:,1) .* z0) - Sp(:,1) ) / n; y0 = sum( (imgP(:,2) .* z0) - Sp(:,2) ) / n; R = [ne1, ne2, ne3]; T = [1,0,x0;0,1,y0;0,0,z0]; [Al, Be, Ga] = deeuler( R ); disp( sprintf( '%.1f, %.1f, %.1f; %f, %f, %f\n', x0, y0, z0, Al, Be, Ga ) ); newP = (GInt * R * T) * hext(Sp(:,1:2))'; newP = hnorm( newP' ); errs1 = vsize( Ip - newP ); errs = mean( errs1 );