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

3D图形编程

开发平台:

Visual C++

  1. function [par,pos,iter,res,er,C]=circal(name,data1,data2,data3,data4,data5,data6)
  2. %CIRCAL Three-step calibration routine for computing the camera parameters. 
  3. %In the first step the initial values are solved by using the DLT method.
  4. %The second step contains nonlinear minimization and in the third step
  5. %the accuracy is improved by taking into account the asymmetric projection
  6. %of the circular control points.      
  7. %
  8. %Usage:
  9. %   [par,pos,iter,res,er,C]=circal(name,data1,data2,data3,data4,data5,data6)
  10. %
  11. %where
  12. %   name = string that is specific to the camera and the framegrabber.
  13. %          This string must be defined in configc.m
  14. %   data1...data6 = matrices that contain the 3-D coordinates of the
  15. %          control points (in fixed right-handed frame) and corresponding
  16. %          image observations (in image frame, origo in the upper left
  17. %          corner). In addition the surface normal of each point must
  18. %          be given.
  19. %          dimensions: (n x 8) matrices,
  20. %          row format: [wx wy wz ix iy nx ny nz],
  21. %          units: mm for control points, pixels for image points,
  22. %          min. number of images = 1 (requires 3-D control point structure)
  23. %          max. number of images = 6
  24. %   par  = camera intrinsic parameters
  25. %   pos  = camera position and orientation for each image (n x 6 matrix)
  26. %   iter = number of iterations used
  27. %   res  = residual (sum of squared errors)
  28. %   er   = remaining error for each point
  29. %   C    = error covariance matrix of the estimated parameters
  30. %   Version 2.0  15.5.-97
  31. %   Janne Heikkila, University of Oulu, Finland
  32. num=nargin-1;
  33. if ~isstr(name)
  34.   error('The first argument should be the camera type');
  35. end
  36. sys=configc(name);
  37. data=[]; obs=[]; sdata=[]; snorm=[]; ipos=[]; tic;
  38. fprintf(1,'step 1: '); %step 1
  39. for i=1:num
  40.   dt=eval(['data' num2str(i)]);
  41.   if size(dt,2)~=8
  42.     error('Data matrix should contain the surface normal');
  43.   end
  44.   data=[data;dt(:,1:3)]; obs=[obs;dt(:,4:5)]; snorm=[snorm;dt(:,6:8)];
  45.   sdata=[sdata;size(dt,1)];
  46.   if norm(dt(:,3))
  47.     [ip,foc,u0,v0,b1,b2]=dlt(sys,dt(:,1:5));
  48.   else
  49.     [ip,foc,u0,v0,b1,b2]=dlt2d(sys,dt(:,1:5));
  50.   end
  51.   ipos=[ipos ip(:)];
  52. end
  53. fprintf(1,'donen');
  54. nbr=sdata'; n=sum(sdata);
  55. iparam=[1 foc u0 v0 0 0 0 0 ipos(:)'];
  56. fprintf(1,'step 2: '); %step 2
  57. [param,iter,res,er,J,success]=lmoptc(sys,[data obs],nbr,iparam);
  58. if success
  59.   par=param(1:8);
  60.   pos=reshape(param(9:length(param)),6,num);
  61.   fprintf(1,'step 3: '); %step 3
  62.   [cdata,dpr]=asymc(sys,par,pos,[data obs],nbr,snorm);
  63.   [param,iter2,res,er,J,success2]=lmoptc(sys,cdata,nbr,param);
  64.   if success2
  65.     q=ones(n,1)*std(reshape(er,n,2));
  66.     Q=spdiags(q(:).^2,1,2*n,2*n);
  67.     X=inv(J'*J)*J';
  68.     C=full(X*Q*X');
  69.     par=param(1:8);
  70.     pos=reshape(param(9:length(param)),6,num);
  71.     disp('Calibration was successfully completed. Here are the results:');
  72.     disp(sprintf('nCamera parameters (%s):',sys(10:length(sys))));
  73.     disp('==================');
  74.     disp(sprintf('Scale factor: %.4f   Effective focal length: %.4f mm',...
  75.     par(1),par(2)));
  76.     disp(sprintf('Principal point: (%.4f,%.4f)',par(3),par(4)));
  77.     disp(sprintf('Radial distortion:     K1 = %e  K2 = %e',par(5),par(6)));
  78.     disp(sprintf('Tangential distortion: T1 = %e  T2 = %e',par(7),par(8)));
  79.     disp(sprintf('nOther information:'));
  80.     disp('==================');
  81.     disp(sprintf('Standard error in pixels: %f',std(er(:))));
  82.     disp(sprintf('Standard deviation of the estimated intrinsic parameters:'));
  83.     disp(sprintf('%.2e ',sqrt(diag(C(1:8,1:8))')));
  84.     disp(sprintf('Number of iterations: %d',iter+iter2));
  85.     disp(sprintf('Elapsed time: %.1f sec.',toc));
  86.   else
  87.     disp('Sorry, calibration failed in step 3');
  88.   end
  89. else
  90.   disp('Sorry, calibration failed in step 2');
  91. end