由于matlab标定数据比opencv的标定准一些,有时候会将matlab的标定参数导入自己程序中应用。
导出matlab标定参数
function writeXML(cameraParams,file)
%writeXML(cameraParams,file)
%功能:将相机校正的参数保存为xml文件
%输入:
%cameraParams:相机校正数据结构
%file:xml文件名
xml = com.mathworks.xml.XMLUtils.createDocument('opencv_storage'); %创建xml文件对象
root = xml.getDocumentElement; %获取根节点
node_Intrinsic = createNode(xml, cameraParams.IntrinsicMatrix, 'camera-matrix');
root.appendChild(node_Intrinsic);
node_Translation = createNode(xml, cameraParams.TranslationVectors, 'translation');
root.appendChild(node_Translation);
node_Rotation = createNode(xml, cameraParams.RotationMatrices, 'rotation');
root.appendChild(node_Rotation);
xmlFileName = file;
xmlwrite(xmlFileName,xml);
end
function [node] = createNode(xml, M, name)
[H, W, C] = size(M);
node = xml.createElement(name); %创建mat节点
node.setAttribute('type_id','opencv-matrix'); %设置mat节点属性
rows = xml.createElement('rows'); %创建行节点
rows.appendChild(xml.createTextNode(sprintf('%d',H))); %创建文本节点,并作为行的子节点
node.appendChild(rows); %将行节点作为mat子节点
cols = xml.createElement('cols');
cols.appendChild(xml.createTextNode(sprintf('%d',W)));
node.appendChild(cols);
dt = xml.createElement('dt');
dt.appendChild(xml.createTextNode(sprintf('"%dd"',C)));
node.appendChild(dt);
data = xml.createElement('data');
if C == 1 % 二维矩阵
for i=1:H
for j=1:W
data.appendChild(xml.createTextNode(sprintf('%.16f ',M(i,j))));
end
data.appendChild(xml.createTextNode(sprintf('\n')));
end
else % 三维矩阵
for i=1:H
for j=1:W
for k = 1:C
data.appendChild(xml.createTextNode(sprintf('%.16f ',M(i,j,k))));
end
data.appendChild(xml.createTextNode(sprintf('\n')));
end
data.appendChild(xml.createTextNode(sprintf('\n\n')));
end
end
node.appendChild(data);
end
python中导入标定参数
file = cv.FileStorage(file_path, cv.FileStorage_READ)
mtx = file.getNode('camera-matrix').mat().T
Tmat = file.getNode('translation').mat()
Rmat = file.getNode('rotation').mat()