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

3D图形编程

开发平台:

Visual C++

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