用matlab完成相机标定,如何基于matlab相机标定导出xml文件

1 参数选择 径向畸变3个参数还是两个参数

默认两个参数

90a9bbb7102a460b75bf41405aa0fd61.png

如果是三个参数

f35b0d919fb9432809703cc395d824ee.png

2准备转化生成结果

86d07b73bb6ba1b9a32370100caf96f6.png

044c2f657fa1b4f07087c8e750f146c6.png

二参数的转化代码

writeExternalandIntrinsicMatrix(cameraParams62,'cameraParams622.xml');

5a3dec5fbd38335e3e6ee35b0de745e3.png

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

二参数的保存结果

3

3

d

1558.5669994681102253 0.0000000000000000 821.5211092415044050

0.0000000000000000 1557.8077127262038175 460.9748043702705331

0.0000000000000000 0.0000000000000000 1.0000000000000000

1

5

d

-0.1873006682834817 0.0171597428423078 0.0000000000000000 0.0000000000000000 0.0000000000000000

1

1

d

1558.5669994681102253

三参数的转化代码

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

三参数的转化保存结果

3

3

d

1558.6100144620272658 0.0000000000000000 821.6453269280840459

0.0000000000000000 1557.8120286433929778 460.8682816753835141

0.0000000000000000 0.0000000000000000 1.0000000000000000

5

1

d

-0.1840928673709393 -0.0328189923757994 0.0000000000000000 0.0000000000000000 0.2205440258401062

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值