% SaveCalPar   save calibration parameters in different formats
%
% [Cst,Rot] = savecalpar(P,config)
% P ... 3*CAM x 4 matrix containing result of selfcalibration, see EUCLIDIZE
% config ... configuration structure, see CONFIGDATA
%
%
% Cst ... CAMSx3   matrix containing the camera centers (in world coord.)
% Rot ... 3*CAMSx3 matrix containing camera rotation matrices

% $Author: svoboda $
% $Revision: 2.0 $
% $Id: savecalpar.m,v 2.0 2003/06/19 12:07:03 svoboda Exp $
% $State: Exp $


function [Cst,Rot] = savecalpar(P,config)

Octave = exist('OCTAVE_VERSION', 'builtin') ~= 0;

idxused = config.cal.cams2use;

CAMS = size(P,1)/3;

Cst = zeros(CAMS,3);
Pst = zeros(3*CAMS,3);
Rot = [];
for i=1:CAMS,
  % do not save P matrices in separate files
  if 1
	Pmat = P(i*3-2:i*3,:);
        if Octave
          save(sprintf(config.files.CalPmat,idxused(i)),'Pmat');
        else
          save(sprintf(config.files.CalPmat,idxused(i)),'Pmat','-ASCII');
        end
  end
  sc = norm(P(i*3,1:3));
  % first normalize the Projection matrices to get normalized pixel points
  P(i*3-2:i*3,:) = P(i*3-2:i*3,:)./sc;
  % decompose the matrix by using rq decomposition
  [K,R] = rq(P(i*3-2:i*3,1:3));
  tvec= inv(K)*P(i*3-2:i*3,4);			% translation vector
  C	  = -R'*tvec;						% camera center
  % Stephi calib params
  Pstephi		   = R'*inv(K);
  Pst(i*3-2:i*3,:) = Pstephi;
  Cst(i,:)		   = C';
  % Stephi requires to save the pars in more "wordy" form
  fid = fopen(sprintf(config.files.StCalPar,idxused(i)),'wt');
  if ~fid
	error('SaveCalPar: The camera cal file cannot be opened');
  else
	fprintf(fid,'C1 = %f \n', C(1));
	fprintf(fid,'C2 = %f \n', C(2));
	fprintf(fid,'C3 = %f \n', C(3));
	fprintf(fid,'\n');
	fprintf(fid,'P11 = %f \n', Pstephi(1,1));
	fprintf(fid,'P12 = %f \n', Pstephi(1,2));
	fprintf(fid,'P13 = %f \n', Pstephi(1,3));
	fprintf(fid,'P21 = %f \n', Pstephi(2,1));
	fprintf(fid,'P22 = %f \n', Pstephi(2,2));
	fprintf(fid,'P23 = %f \n', Pstephi(2,3));
	fprintf(fid,'P31 = %f \n', Pstephi(3,1));
	fprintf(fid,'P32 = %f \n', Pstephi(3,2));
	fprintf(fid,'P33 = %f \n', Pstephi(3,3));
	fclose(fid);
  end
  Rot	 = [Rot;R];
  % Prithwijit requires to save the pars in more "wordy" form
  if 0 % do not save in the Prithwijit format
	fid = fopen(sprintf(config.files.CalPar,idxused(i)),'wt');
	if ~fid
	  error('SaveCalPar: The camera cal file cannot be opened');
	else
	  fprintf(fid,'R11 = %f \n',R(1,1));
	  fprintf(fid,'R12 = %f \n',R(1,2));
	  fprintf(fid,'R13 = %f \n',R(1,3));
	  fprintf(fid,'R21 = %f \n',R(2,1));
	  fprintf(fid,'R22 = %f \n',R(2,2));
	  fprintf(fid,'R23 = %f \n',R(2,3));
	  fprintf(fid,'R31 = %f \n',R(3,1));
	  fprintf(fid,'R32 = %f \n',R(3,2));
	  fprintf(fid,'R33 = %f \n',R(3,3));
	  fprintf(fid,'\n');
	  fprintf(fid,'t11 = %f \n',tvec(1));
	  fprintf(fid,'t21 = %f \n',tvec(2));
	  fprintf(fid,'t31 = %f \n',tvec(3));
	  fprintf(fid,'\n');
	  fprintf(fid,'K11 = %f \n',K(1,1));
	  fprintf(fid,'K12 = %f \n',K(1,2));
	  fprintf(fid,'K13 = %f \n',K(1,3));
	  fprintf(fid,'K21 = %f \n',K(2,1));
	  fprintf(fid,'K22 = %f \n',K(2,2));
	  fprintf(fid,'K23 = %f \n',K(2,3));
	  fprintf(fid,'K31 = %f \n',K(3,1));
	  fprintf(fid,'K32 = %f \n',K(3,2));
	  fprintf(fid,'K33 = %f \n',K(3,3));
	  fprintf(fid,'\n');
	  fclose(fid);
	end
  end
end

% save Stehpi params
if Octave
  save(config.files.Pst,'Pst');
  save(config.files.Cst,'Cst');
else
  save(config.files.Pst,'Pst','-ASCII');
  save(config.files.Cst,'Cst','-ASCII');
end
