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

3D图形编程

开发平台:

Visual C++

  1. function [cdata,dpr]=asymc(sys,par,pos,data,nbr,snorm)
  2. %ASYMC Routine that corrects the effect of the asymmetric projection
  3. %of the circular control points. 
  4. %
  5. %Usage:
  6. %   [cdata,dpr]=asymc(sys,par,pos,data,nbr,snorm)
  7. %
  8. %where
  9. %   sys  = system configuration information (see configc.m) 
  10. %   par  = approximation of the intrinsic parameters of the camera
  11. %   pos  = approximation of the camera positions and orientations 
  12. %          (6 x m matrix)
  13. %   data = matrix that contains the 3-D coordinates of the
  14. %          control points (in fixed right-handed frame) and corresponding
  15. %          image observations (in image frame, origo in the upper left
  16. %          corner) 
  17. %          Dimensions: (n x 5) matrix, format: [wx wy wz ix iy]
  18. %   nbr  = number of points per frame
  19. %   snorm = normal vectors for each point (n x 3 matrix)
  20. %   cdata = corrected data matrix
  21. %   dpr  = error term
  22. %   Version 2.0  15.5.-97
  23. %   Janne Heikkila, University of Oulu, Finland
  24. NDX=sys(1); NDY=sys(2); Sx=sys(3); Sy=sys(4);
  25. radius=sys(6); Asp=par(1); foc=par(2); n=length(data);
  26. v1=-snorm;
  27. vv=randn(3,1); vv=vv/norm(vv);
  28. v2=ones(n,1)*vv'-v1*[vv vv vv].*v1;
  29. nnn=sqrt(sum(v2'.^2))';
  30. v2=v2./[nnn nnn nnn];
  31. v3=[v1(:,2).*v2(:,3)-v1(:,3).*v2(:,2) ...
  32.     v1(:,3).*v2(:,1)-v1(:,1).*v2(:,3) ...
  33.     v1(:,1).*v2(:,2)-v1(:,2).*v2(:,1)];
  34. ind=cumsum([1 nbr]);
  35. dpr=zeros(n,2);
  36. num=size(pos,2);
  37. for i=1:num  
  38.   M=eye(4);
  39.   wa=pos(4,i)*pi/180;
  40.   pa=pos(5,i)*pi/180;
  41.   ra=pos(6,i)*pi/180;
  42.   cw=cos(wa); sw=sin(wa);
  43.   cp=cos(pa); sp=sin(pa);
  44.   cr=cos(ra); sr=sin(ra);
  45.   M(1,:)=[cr*cp -sr*cw+cr*sp*sw sr*sw+cr*sp*cw pos(1,i)];
  46.   M(2,:)=[sr*cp cr*cw+sr*sp*sw -cr*sw+sr*sp*cw pos(2,i)];
  47.   M(3,:)=[-sp cp*sw cp*cw pos(3,i)];
  48.   iM=inv(M);
  49.   cpos=iM(1:3,4);
  50.   cx=-v2(ind(i):ind(i+1)-1,:)*cpos;
  51.   cy=-v3(ind(i):ind(i+1)-1,:)*cpos;
  52.   cz=-v1(ind(i):ind(i+1)-1,:)*cpos;
  53.   A1=[v2(ind(i):ind(i+1)-1,:) cx]*iM;
  54.   A2=[v3(ind(i):ind(i+1)-1,:) cy]*iM;
  55.   A3=[v1(ind(i):ind(i+1)-1,:) cz]*iM;
  56.   mod=data(ind(i):ind(i+1)-1,1:3);
  57.   dx=mod(:,1).*v2(ind(i):ind(i+1)-1,1)+mod(:,2).*v2(ind(i):ind(i+1)-1,2)+...
  58.      mod(:,3).*v2(ind(i):ind(i+1)-1,3)+cx;
  59.   dy=mod(:,1).*v3(ind(i):ind(i+1)-1,1)+mod(:,2).*v3(ind(i):ind(i+1)-1,2)+...
  60.      mod(:,3).*v3(ind(i):ind(i+1)-1,3)+cy;
  61.   dz=mod(:,1).*v1(ind(i):ind(i+1)-1,1)+mod(:,2).*v1(ind(i):ind(i+1)-1,2)+...
  62.      mod(:,3).*v1(ind(i):ind(i+1)-1,3)+cz;
  63.   alpha=dx./dz;
  64.   beta=dy./dz;
  65.   gamma=radius./dz;
  66.   kt=A1(:,1)-alpha.*A3(:,1); lt=A1(:,2)-alpha.*A3(:,2);
  67.   mt=(A1(:,3)-alpha.*A3(:,3))*foc; nt=A2(:,1)-beta.*A3(:,1);
  68.   pt=A2(:,2)-beta.*A3(:,2); qt=(A2(:,3)-beta.*A3(:,3))*foc;
  69.   rt=gamma.*A3(:,1); st=gamma.*A3(:,2); tt=gamma.*A3(:,3)*foc;
  70.   uc=(kt.*pt-nt.*lt).*(lt.*qt-pt.*mt)-(kt.*st-lt.*rt).*(tt.*lt-mt.*st)-...
  71.      (nt.*st-pt.*rt).*(tt.*pt-qt.*st);
  72.   vc=(kt.*pt-nt.*lt).*(mt.*nt-kt.*qt)-(kt.*st-lt.*rt).*(mt.*rt-kt.*tt)-...
  73.      (nt.*st-pt.*rt).*(qt.*rt-nt.*tt);
  74.   den=(kt.*pt-nt.*lt).^2-(kt.*st-lt.*rt).^2-(nt.*st-pt.*rt).^2;
  75.   uc=uc./den; vc=vc./den;
  76.   u0=(lt.*qt-pt.*mt)./(kt.*pt-nt.*lt);
  77.   v0=(mt.*nt-kt.*qt)./(kt.*pt-nt.*lt);
  78.   dpr(ind(i):ind(i+1)-1,1)=NDX*Asp*(uc-u0)/Sx;
  79.   dpr(ind(i):ind(i+1)-1,2)=NDY*(vc-v0)/Sy;
  80. end
  81. cdata=[data(:,1:3) data(:,4:5)-dpr];