![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
function [A,R,t]=art(P,fsign)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
%ART Factorize camera matrix into intrinsic and extrinsic matrices
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
%
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% [A,R,t] = art(P,fsign) factorize the projection matrix P
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% as P=A*[R;t] and enforce the sign of the focal lenght to be fsign.
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% By defaukt fsign=1.
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% Author: A. Fusiello, 1999
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
%
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% fsign tells the position of the image plane wrt the focal plane. If it is
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% negative the image plane is behind the focal plane.
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% by default assume POSITIVE focal lenght
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if nargin == 1
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
fsign = 1;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
end
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
s = P(1:3,4);
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Q = inv(P(1:3, 1:3));
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
[U,B] = qr(Q);
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% fix the sign of B(3,3). This can possibly change the sign of the resulting matrix,
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% which is defined up to a scale factor, however.
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sig = sign(B(3,3));
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
B=B*sig;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
s=s*sig;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% if the sign of the focal lenght is not the required one,
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% change it, and change the rotation accordingly.
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if fsign*B(1,1) < 0
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
E= [-1 0 0
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
0 1 0
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
0 0 1];
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
B = E*B;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
U = U*E;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
end
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if fsign*B(2,2) < 0
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
E= [1 0 0
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
0 -1 0
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
0 0 1];
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
B = E*B;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
U = U*E;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
end
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% if U is not a rotation, fix the sign. This can possibly change the sign
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% of the resulting matrix, which is defined up to a scale factor, however.
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if det(U)< 0
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
U = -U;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
s= - s;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
end
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% sanity check
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if (norm(Q-U*B)>1e-10) & (norm(Q+U*B)>1e-10)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
error(‘Something wrong with the QR factorization.‘); end
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
R = U‘;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
t = B*s;
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
A = inv(B);
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
A = A ./A(3,3);
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% sanity check
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if det(R) < 0 error(‘R is not a rotation matrix‘); end
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if A(3,3) < 0 error(‘Wrong sign of A(3,3)‘); end
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
% this guarantee that the result *is* a factorization of the given P, up to a scale factor
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
W = A*[R,t];
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if (rank([P(:), W(:)]) ~= 1 )
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
error(‘Something wrong with the ART factorization.‘); end
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![bubuko.com,布布扣](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)