matlab相機標定匯出xml檔案
阿新 • • 發佈:2020-08-15
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>