1. 程式人生 > 實用技巧 >matlab相機標定匯出xml檔案

matlab相機標定匯出xml檔案

1 引數選擇 徑向畸變3個引數還是兩個引數

預設兩個引數

如果是三個引數

2準備轉化生成結果

二引數的轉化程式碼

writeExternalandIntrinsicMatrix(cameraParams62,'cameraParams622.xml');

function writeExternalandIntrinsicMatrix(cameraParams,file)
%writeXML(cameraParams,file)

docNode = com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
docRootNode = docNode.getDocumentElement; 
IntrinsicMatrix = ((cameraParams.IntrinsicMatrix)'); 

TangentialDistortion =cameraParams.TangentialDistortion; 
%Distortion = [cameraParams.RadialDistortion(1:2),TangentialDistortion, cameraParams.RadialDistortion(3)]; 
Distortion = [cameraParams.RadialDistortion(1:2),TangentialDistortion,0]; 
FocalLength = cameraParams.FocalLength;
camera_matrix = docNode.createElement('IntrinsicCam'); %錕斤拷錕斤拷mat錕節碉拷
camera_matrix.setAttribute('type_id','opencv-matrix'); %錕斤拷錕斤拷mat錕節碉拷錕斤拷錕斤拷
rows = docNode.createElement('rows'); %錕斤拷錕斤拷錕叫節碉拷
rows.appendChild(docNode.createTextNode(sprintf('%d',3))); %錕斤拷錕斤拷錕僥憋拷錕節點,錕斤拷錕斤拷為錕叫碉拷錕接節碉拷
camera_matrix.appendChild(rows); %錕斤拷錕叫節碉拷錕斤拷為mat錕接節碉拷

cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',3)));
camera_matrix.appendChild(cols);

dt = docNode.createElement('dt');
dt.appendChild(docNode.createTextNode('d'));
camera_matrix.appendChild(dt);

data = docNode.createElement('data');
for i=1:3
    for j=1:3
        data.appendChild(docNode.createTextNode(sprintf('%.16f ',IntrinsicMatrix(i,j))));
    end
    data.appendChild(docNode.createTextNode(sprintf('\n')));
end
camera_matrix.appendChild(data);
docRootNode.appendChild(camera_matrix);

distortion = docNode.createElement('DistortionCam');
distortion.setAttribute('type_id','opencv-matrix');
rows = docNode.createElement('rows');
rows.appendChild(docNode.createTextNode(sprintf('%d',1)));
distortion.appendChild(rows);

cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',5)));
distortion.appendChild(cols);

dt = docNode.createElement('dt');
dt.appendChild(docNode.createTextNode('d'));
distortion.appendChild(dt);
data = docNode.createElement('data');
for i=1:5
      data.appendChild(docNode.createTextNode(sprintf('%.16f ',Distortion(i))));
end
distortion.appendChild(data);
docRootNode.appendChild(distortion);


focalLength = docNode.createElement('FocalLength');
focalLength.setAttribute('type_id','opencv-matrix');
rows = docNode.createElement('rows');
rows.appendChild(docNode.createTextNode(sprintf('%d',1)));
focalLength.appendChild(rows);
cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',1)));
focalLength.appendChild(cols);
dt = docNode.createElement('dt');
dt.appendChild(docNode.createTextNode('d'));
focalLength.appendChild(dt);
data = docNode.createElement('data');
for i=1:1
      data.appendChild(docNode.createTextNode(sprintf('%.16f ',FocalLength(i))));
end
focalLength.appendChild(data);
docRootNode.appendChild(focalLength);

% distortion = docNode.createElement('Pmatrix');
% distortion.setAttribute('type_id','opencv-matrix');
% rows = docNode.createElement('rows');
% rows.appendChild(docNode.createTextNode(sprintf('%d',1)));
% distortion.appendChild(rows);
% 
% cols = docNode.createElement('cols');
% cols.appendChild(docNode.createTextNode(sprintf('%d',4)));
% distortion.appendChild(cols);
% 
% dt = docNode.createElement('dt');
% dt.appendChild(docNode.createTextNode('d'));
% distortion.appendChild(dt);
% data = docNode.createElement('data');
% for i=1:4
%       data.appendChild(docNode.createTextNode(sprintf('%.16f ',Distortion(i))));
% end
% distortion.appendChild(data);
% docRootNode.appendChild(distortion);


xmlFileName = file;
xmlwrite(xmlFileName,docNode);
end

  

二引數的儲存結果

<?xml version="1.0" encoding="utf-8"?>
<opencv_storage>
   <IntrinsicCam type_id="opencv-matrix">
      <rows>3</rows>
      <cols>3</cols>
      <dt>d</dt>
      <data>1558.5669994681102253 0.0000000000000000 821.5211092415044050 
0.0000000000000000 1557.8077127262038175 460.9748043702705331 
0.0000000000000000 0.0000000000000000 1.0000000000000000 
</data>
   </IntrinsicCam>
   <DistortionCam type_id="opencv-matrix">
      <rows>1</rows>
      <cols>5</cols>
      <dt>d</dt>
      <data>-0.1873006682834817 0.0171597428423078 0.0000000000000000 0.0000000000000000 0.0000000000000000 </data>
   </DistortionCam>
   <FocalLength type_id="opencv-matrix">
      <rows>1</rows>
      <cols>1</cols>
      <dt>d</dt>
      <data>1558.5669994681102253 </data>
   </FocalLength>
</opencv_storage>

  

三引數的轉化程式碼

function writeXML(cameraParams,file)
%writeXML(cameraParams,file)
%功能:將相機校正的引數儲存為xml檔案
%輸入:
%cameraParams:相機校正資料結構
%file:xml檔名
%說明在xml檔案是由一層層的節點組成的。
%首先建立父節點 fatherNode,
%然後建立子節點 childNode=docNode.createElement(childNodeName),
%再將子節點新增到父節點 fatherNode.appendChild(childNode)
docNode = com.mathworks.xml.XMLUtils.createDocument('opencv_storage'); %建立xml檔案物件
docRootNode = docNode.getDocumentElement; %獲取根節點

IntrinsicMatrix = (cameraParams.IntrinsicMatrix)'; %相機內參矩陣
RadialDistortion = cameraParams.RadialDistortion; %相機徑向畸變引數向量1*3
TangentialDistortion =cameraParams.TangentialDistortion; %相機切向畸變向量1*2
    Distortion = [RadialDistortion(1:2),TangentialDistortion,RadialDistortion(3)]; %構成opencv中的畸變係數向量[k1,k2,p1,p2,k3]

camera_matrix = docNode.createElement('camera-matrix'); %建立mat節點
camera_matrix.setAttribute('type_id','opencv-matrix'); %設定mat節點屬性
rows = docNode.createElement('rows'); %建立行節點
rows.appendChild(docNode.createTextNode(sprintf('%d',3))); %建立文字節點,並作為行的子節點
camera_matrix.appendChild(rows); %將行節點作為mat子節點

cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',3)));
camera_matrix.appendChild(cols);

dt = docNode.createElement('dt');
dt.appendChild(docNode.createTextNode('d'));
camera_matrix.appendChild(dt);

data = docNode.createElement('data');
for i=1:3
    for j=1:3
        data.appendChild(docNode.createTextNode(sprintf('%.16f ',IntrinsicMatrix(i,j))));
    end
    data.appendChild(docNode.createTextNode(sprintf('\n')));
end
camera_matrix.appendChild(data);
docRootNode.appendChild(camera_matrix);

distortion = docNode.createElement('distortion');
distortion.setAttribute('type_id','opencv-matrix');
rows = docNode.createElement('rows');
rows.appendChild(docNode.createTextNode(sprintf('%d',5)));
distortion.appendChild(rows);

cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',1)));
distortion.appendChild(cols);

dt = docNode.createElement('dt');
dt.appendChild(docNode.createTextNode('d'));
distortion.appendChild(dt);
data = docNode.createElement('data');
for i=1:5
      data.appendChild(docNode.createTextNode(sprintf('%.16f ',Distortion(i))));
end
distortion.appendChild(data);

docRootNode.appendChild(distortion);

xmlFileName = file;
xmlwrite(xmlFileName,docNode);
end

  

三引數的轉化儲存結果

<?xml version="1.0" encoding="utf-8"?>
<opencv_storage>
   <camera-matrix type_id="opencv-matrix">
      <rows>3</rows>
      <cols>3</cols>
      <dt>d</dt>
      <data>1558.6100144620272658 0.0000000000000000 821.6453269280840459 
0.0000000000000000 1557.8120286433929778 460.8682816753835141 
0.0000000000000000 0.0000000000000000 1.0000000000000000 
</data>
   </camera-matrix>
   <distortion type_id="opencv-matrix">
      <rows>5</rows>
      <cols>1</cols>
      <dt>d</dt>
      <data>-0.1840928673709393 -0.0328189923757994 0.0000000000000000 0.0000000000000000 0.2205440258401062 </data>
   </distortion>
</opencv_storage>