dlt.m
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:2k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. function [pos,foc,u0,v0,b1,b2]=dlt(sys,data)
  2. %DLT Direct linear transform, which calculates the initial camera 
  3. %parameters for nonlinear optimization.
  4. %         
  5. %Usage:
  6. %   [pos,foc,u0,v0,b1,b2] = dlt(sys,data)  
  7. %
  8. %where           
  9. %   sys  = system configuration information (see configc.m) 
  10. %   data = matrix that contains the 3-D coordinates of the
  11. %          control points (in fixed right-handed frame) and corresponding
  12. %          image observations (in image frame, origo in the upper left
  13. %          corner and the y-axis downwards) 
  14. %          Dimensions: (n x 5) matrix, format: [wx wy wz ix iy]
  15. %          NOTE: control points should not be coplanar
  16. %   pos  = camera position and orientation [x y z w p r]
  17. %   foc  = effective focal length (obtained from sys)
  18. %   u0, v0 = principal point (obtained from sys)
  19. %   b1, b2 = linear distortion coefficients
  20. %Reference:
  21. %   Trond Melen: Geometrical modelling and calibration of video
  22. %   cameras for underwater navigation, Ph.D.-thesis, 
  23. %   ITK-rapport 1994:103-W, NTH, Norway.           
  24. %
  25. %   Version 2.0  15.5.-97
  26. %   Janne Heikkila, University of Oulu, Finland
  27. NDX=sys(1); NDY=sys(2); Sx=sys(3); Sy=sys(4); f0=sys(5);
  28. wx=data(:,1); wy=data(:,2); wz=data(:,3);
  29. num=size(data,1);
  30. u = Sx*data(:,4)/NDX;
  31. v = Sy*data(:,5)/NDY;
  32. Lu=[wx wy wz 0*u+1 0*u 0*u 0*u 0*u -wx.*u -wy.*u -wz.*u];
  33. Lv=[0*v 0*v 0*v 0*v wx wy wz 0*v+1 -wx.*v -wy.*v -wz.*v];
  34. L=reshape([Lu';Lv'],11,2*num)';
  35. l=reshape([u';v'],2*num,1);
  36. a=pinv(L)*l;
  37. a(12)=1;
  38. A=reshape(a,4,3)';
  39. t=inv(A(:,1:3))*A(:,4);
  40. lambda=sqrt(A(3,1)^2+A(3,2)^2+A(3,3)^2);
  41. [Q,R]=qr(inv(A(:,1:3)/lambda));
  42. R=inv(R); Q=Q';
  43. J=diag(sign(diag(R)));
  44. R=R*J;
  45. tth=-R(1,2)/(R(1,1)+R(2,2));
  46. sth=tth/sqrt(1+tth^2); cth=1/sqrt(1+tth^2);
  47. S=[cth sth 0;-sth cth 0;0 0 1];
  48. M=S'*J*Q;
  49. lambda=det(M)*lambda;
  50. M=det(M)*M;
  51. G=R*S;
  52. b1=-(G(1,1)-G(2,2))/(G(1,1)+G(2,2));
  53. b2=-2*G(1,2)/(G(1,1)+G(2,2));
  54. foc=2*(G(1,1)*G(2,2)-G(1,2)^2)/(G(1,1)+G(2,2));
  55. u0=G(1,3)*NDX/Sx; v0=G(2,3)*NDY/Sy;
  56. t=M*t;
  57. pa=asin(M(3,1));
  58. wa=atan2(-M(3,2)/cos(pa),M(3,3)/cos(pa));
  59. ra=atan2(-M(2,1)/cos(pa),M(1,1)/cos(pa));
  60. pos=[t' -[wa pa ra]*180/pi];