gusucode.com > 基于matlab软件,实现双目视觉原理的摄像机标定,能根据各视场图像求内、外部参数 > 基于matlab软件,实现双目视觉原理的摄像机标定,能根据各视场图像求内、外部参数/TOOLBOX_calib/cam_proj_calib.m
%%% This code is an additional code that helps doing projector calibration in 3D scanning setup. %%% This is not a useful code for anyone else but me. %%% I included it in the toolbox for illustration only. fprintf(1,'3D scanner calibration code\n'); fprintf(1,'(c) Jean-Yves Bouguet - August 2000\n'); fprintf(1,'Intel Corporation\n'); if ~exist('camera_results.mat'), if exist('Calib_Results.mat'), copyfile('Calib_Results.mat','camera_results.mat'); delete('Calib_Results.mat'); else disp('ERROR: Need to calibrate the camera first, save results, and run cam_proj_calib'); break; end; end; if 0, % If I want to run camera calibration again load camera_results; % Do estimate distortion: est_dist = [1 0 0 0 0]; %ones(5,1); est_alpha = 0; center_optim = 1; % Run the main calibration routine: go_calib_optim; saving_calib; copyfile('Calib_Results.mat','camera_results.mat'); delete('Calib_Results.mat'); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% START THE MAIN PROCEDURE %%%%%%%%%%%%%%%%%%%%%%%%%%% load camera_results; param = solution; % Save camera parameters: fc_save = fc; cc_save = cc; kc_save = kc; alpha_c_save = alpha_c; omc_1_save = omc_1; Rc_1_save = Rc_1; Tc_1_save = Tc_1; clear fc cc kc alpha_c param_cam = param([1:10 16:end]); % Extract projector data? if ~exist('projector_data.mat'), projector_calib; % extract the projector corners (all the data) else load projector_data; % load the projector corners (previously saved) end; % Start projector calibration: X_proj = []; x_proj = []; n_ima_proj = []; for kk = ind_active, eval(['xproj = xproj_' num2str(kk) ';']); xprojn = normalize_pixel(xproj,fc_save,cc_save,kc_save,alpha_c_save); eval(['Rc = Rc_' num2str(kk) ';']); eval(['Tc = Tc_' num2str(kk) ';']); Np_proj = size(xproj,2); Zc = ((Rc(:,3)'*Tc) * (1./(Rc(:,3)' * [xprojn; ones(1,Np_proj)]))); Xcp = (ones(3,1)*Zc) .* [xprojn; ones(1,Np_proj)]; % % in the camera frame eval(['X_proj_' num2str(kk) ' = Xcp;']); % coordinates of the points in the eval(['X_proj = [X_proj X_proj_' num2str(kk) '];']); eval(['x_proj = [x_proj x_proj_' num2str(kk) '];']); n_ima_proj = [n_ima_proj kk*ones(1,Np_proj)]; end; % Image size: (may or may not be available) nx = 1024; ny = 768; % No calibration image is available (only the corner coordinates) no_image = 1; n_ima_save = n_ima; X_1_save = X_1; x_1_save = x_1; dX_save = dX; dY_save = dY; n_ima = 1; X_1 = X_proj; x_1 = x_proj; % Set the toolbox not to prompt the user (choose default values) dont_ask = 1; % Do estimate distortion: est_dist = [1 0 0 0 0]'; %ones(5,1); est_alpha = 0; center_optim = 1; % Run the main calibration routine: clear fc kc cc alpha_c KK go_calib_optim; param = solution; param_proj = param([1:10 16:end]); % Shows the extrinsic parameters: dX = 30; dY = 30; ext_calib; % Reprojection on the original images: reproject_calib; %saving_calib; %copyfile([save_name '.mat'],'projector_results.mat'); saving_calib; copyfile('Calib_Results.mat','projector_results.mat'); delete('Calib_Results.mat'); n_ima = n_ima_save; X_1 = X_1_save; x_1 = x_1_save; no_image = 0; dX = dX_save; dY = dY_save; %----------------------- Retrieve results: % Intrinsic: % Projector: fp = fc; cp = cc; kp = kc; alpha_p = alpha_c; % Camera: fc = fc_save; cc = cc_save; kc = kc_save; alpha_c = alpha_c_save; % Extrinsic: % Relative position of projector and camera: T = Tc_1; om = omc_1; R = rodrigues(om); % Relative prosition of camera wrt world: omc = omc_1_save; Rc = Rc_1_save; Tc = Tc_1_save; % relative position of projector wrt world: Rp = R*Rc; omp = rodrigues(Rp); Tp = T + R*Tc; eval(['save calib_cam_proj R om T fc fp cc cp alpha_c alpha_p kc kp Rc Rp Tc Tp omc omp']); % Final refinement: %----------------- global optimization: --------------------- cam_proj_calib_optim;