1. 程式人生 > 程式設計 >如何基於matlab相機標定匯出xml檔案

如何基於matlab相機標定匯出xml檔案

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

預設兩個引數

如何基於matlab相機標定匯出xml檔案

如果是三個引數

如何基於matlab相機標定匯出xml檔案

2準備轉化生成結果

如何基於matlab相機標定匯出xml檔案

如何基於matlab相機標定匯出xml檔案

二引數的轉化程式碼

writeExternalandIntrinsicMatrix(cameraParams62,'cameraParams622.xml');

如何基於matlab相機標定匯出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),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',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)
%功能:將相機校正的引數儲存為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),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',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',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>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。