www.pudn.com > calibr8.zip > estiDLT.m
function [DLT, errstat] = estiDLT( data )
p = data(:, 1 : 3);
q = data(:, 4 : 5);
[n m] = size(p);
NDX=768; NDY=576; Sx=6.2031; Sy=4.6515; f0=16;
%NDX=sys(1); NDY=sys(2); Sx=sys(3); Sy=sys(4); f0=sys(5);
wx=data(:,1); wy=data(:,2); wz=data(:,3);
num=size(data,1);
u = Sx*data(:,4)/NDX;
v = Sy*data(:,5)/NDY;
Lu=[wx wy wz 0*u+1 0*u 0*u 0*u 0*u -wx.*u -wy.*u -wz.*u];
Lv=[0*v 0*v 0*v 0*v wx wy wz 0*v+1 -wx.*v -wy.*v -wz.*v];
L=reshape([Lu';Lv'],11,2*num)';
l=reshape([u';v'],2*num,1);
a=pinv(L)*l;
a(12)=1;
DLT=reshape(a,4,3)';
newq = applyDLT(DLT, p);
%newq = newq ./ 123.809
% errors = newp - p;
errors = newq - (q./123.809);
xyzmeans = sum(abs(errors)) ./ n;
xyzoffsets = sum(errors) ./ n;
err = vsize(errors);
errstat = [mean(err), max(err), std(err)];
% display results
disp(sprintf('%d points, estimated DLT:', n));
disp(DLT);
disp('Mean and shift for each axis:');
disp(sprintf(' X: %f, %f', xyzmeans(1), xyzoffsets(1)));
disp(sprintf(' Y: %f, %f', xyzmeans(2), xyzoffsets(2)));
%disp(sprintf(' Z: %f, %f', xyzmeans(3), xyzoffsets(3)));
disp(sprintf('Errors in the object space: mean = %f, max = %f, std = %f', ...
errstat(1), errstat(2), errstat(3)));