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

3D图形编程

开发平台:

Visual C++

  1. function [p,iter,res,er,J,succ]=lmoptc(sys,data,nbr,p0,np,cpar)
  2. %LMOPTC Performs the Levenberg-Marquardt nonlinear optimization for
  3. %camera calibration.
  4. %
  5. %Usage:
  6. %   [p,iter,res,er,J,succ]=lmoptc(sys,data,nbr,p0)
  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) 
  14. %          Dimensions: (n x 5) matrix, format: [wx wy wz ix iy]
  15. %   nbr  = number of points per frame
  16. %   p0   = initial parameter vector (8+N*6 x 1)
  17. %          p(1:8) contains the camera intrinsic parameters
  18. %          p(9...) contains the camera position and orientation for
  19. %          each N images. 
  20. %   p    = resulting parameter vector
  21. %   iter = number of iterations used (min=10)
  22. %   res  = residual (sum of squared errors)
  23. %   er   = remaining error for each point
  24. %   J    = Jacobian matrix
  25. %   succ = successful optimization (1 = true, 0 = false)
  26. %   Version 2.1b  25.08.1998
  27. %   Janne Heikkila, University of Oulu, Finland
  28. miter=10; lim=100;
  29. n=length(p0);
  30. p=p0(:);
  31. if nargin==4
  32.   np=8; cpar=[];
  33. end
  34. if nargin==5
  35.   cpar=[];
  36. end
  37. mod=data(:,1:3); y=data(:,4:5); y=y(:);
  38. [f,J]=jacobc(sys,mod,nbr,p,np,cpar);
  39. er=y-f; res=er'*er; lambda=0.001;
  40. beta=J'*er; alpha=J'*J;
  41. pres=res; pp=p; succ=0;
  42. %disp(sprintf('%d %.4f %.4e',0,res,lambda));
  43. fprintf(1,'iterating');
  44. for i=1:lim
  45.   ind=1:(n+1):(n*n);
  46.   tt=alpha(ind);
  47.   alpha(ind)=tt*(1+lambda);
  48.   dp=alphabeta;
  49.   p=p+dp;
  50.   [f,J]=jacobc(sys,mod,nbr,p,np,cpar);
  51.   er=y-f; res=er'*er;
  52.   if abs(res-pres)<1e-4 & i>miter, succ=1; break; end
  53.   if res<pres
  54.     lambda=0.1*lambda;
  55.     if lambda<1e-7,lambda=1e-7; end;
  56.     beta=J'*er; alpha=J'*J;
  57.     pres=res; pp=p;
  58.   else
  59.     lambda=10*lambda;
  60.     alpha(ind)=tt;
  61.     res=pres; p=pp;
  62.   end
  63.   %disp(sprintf('%d %.4f %.4e',i,res,lambda));
  64.   fprintf(1,'.');
  65. end
  66. disp('done');  
  67. iter=i;