我是靠谱客的博主 温柔御姐,最近开发中收集的这篇文章主要介绍MATLAB单目相机标定的使用并导出XML文件前言省略的标定工作。。。参数导出XML生成的XML文件注意,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
MATLAB单目相机标定的使用并导出XML文件
- 前言
- 省略的标定工作。。。
- 参数导出XML
- 生成的XML文件
- 注意
前言
本文参考MATLAB相机标定的使用并导出XML文件。在此基础上,增加了获取输出某张标定图像对应的外参(旋转矩阵和平移向量功能)。同时,对畸变参数重新做了取舍,去除了径向畸变k3,即在标定前按默认选择“2 Coefficient”。
省略的标定工作。。。
参数导出XML
通过编写MATLAB函数向相机标定的内参和畸变参数保存为opencv可以读取的XML文件。
function WriteXML(cameraParams,imgNum,file)
%writeXML(cameraParams,file)
%功能:将相机校正的参数(包括内参,外参,畸变参数)保存为xml文件
%输入:
%@cameraParams:相机校正数据结构
%@imgNum:所需要获取外参的图片序号
%@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*2
%TangentialDistortion =cameraParams.TangentialDistortion; %相机切向畸变向量1*2
Distortion = RadialDistortion(1:2); %构成opencv中的畸变系数向量[k1,k2]忽略p1,p2,k3
RotationMatrice = cameraParams.RotationMatrices(:,:,imgNum);%这里取所需要图片对应的外参旋转矩阵
TranslationVector = cameraParams.TranslationVectors(imgNum:imgNum,1:3);%这里取所需要图片对应的外参平移向量
%1-内参
camera_matrix = docNode.createElement('IntrinsicMatrix'); %创建mat节点
camera_matrix.setAttribute('type_id','Opencv-IntrinsicMatrix'); %设置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);
data = docNode.createElement('data');
for i=1:3
for j=1:3
data.appendChild(docNode.createTextNode(sprintf('%.4f ',IntrinsicMatrix(i,j))));
end
%data.appendChild(docNode.createTextNode(sprintf('n')));
end
camera_matrix.appendChild(data);
docRootNode.appendChild(camera_matrix);
%2-畸变
distortion = docNode.createElement('Distortion');
distortion.setAttribute('type_id','Opencv-Distortion');
rows = docNode.createElement('rows');
rows.appendChild(docNode.createTextNode(sprintf('%d',2)));
distortion.appendChild(rows);
cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',1)));
distortion.appendChild(cols);
data = docNode.createElement('data');
for i=1:2
data.appendChild(docNode.createTextNode(sprintf('%.16f ',Distortion(i))));
end
distortion.appendChild(data);
docRootNode.appendChild(distortion);
%3-外参.旋转
rotation = docNode.createElement('Rotation'); %创建mat节点
rotation.setAttribute('type_id','Opencv-Rotation'); %设置mat节点属性
rows = docNode.createElement('rows'); %创建行节点
rows.appendChild(docNode.createTextNode(sprintf('%d',3))); %创建文本节点,并作为行的子节点
rotation.appendChild(rows); %将行节点作为mat子节点
cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',3)));
rotation.appendChild(cols);
%设置当前图片序号节点
dt = docNode.createElement('imgNum');
dt.appendChild(docNode.createTextNode(sprintf('%d',imgNum)));
rotation.appendChild(dt);
data = docNode.createElement('data');
for i=1:9
data.appendChild(docNode.createTextNode(sprintf('%.5f ',RotationMatrice(i))));
if mod(i,3)==0
%data.appendChild(docNode.createTextNode(sprintf('n')));%为了方便导出,不换行了
end
end
rotation.appendChild(data);
docRootNode.appendChild(rotation);
%4-外参.平移
translation = docNode.createElement('TranslationVector');
translation.setAttribute('type_id','Opencv-TranslationVector');
rows = docNode.createElement('rows');
rows.appendChild(docNode.createTextNode(sprintf('%d',3)));
translation.appendChild(rows);
cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',1)));
translation.appendChild(cols);
%设置当前图片序号节点
dt = docNode.createElement('imgNum');
dt.appendChild(docNode.createTextNode(sprintf('%d',imgNum)));
translation.appendChild(dt);
data = docNode.createElement('data');
for i=1:3
data.appendChild(docNode.createTextNode(sprintf('%.4f ',TranslationVector(i))));
end
translation.appendChild(data);
docRootNode.appendChild(translation);
xmlFileName = file;
xmlwrite(xmlFileName,docNode);
end
调用如下:
>> WriteXML(cameraParams,1,'cameraParams.xml');
生成的XML文件
<?xml version="1.0" encoding="utf-8"?>
<opencv_storage>
<IntrinsicMatrix type_id="Opencv-IntrinsicMatrix">
<rows>3</rows>
<cols>3</cols>
<data>5013.3472 0.0000 0.0000 0.0000 5015.6284 0.0000 2712.3625 1808.7330 1.0000 </data>
</IntrinsicMatrix>
<Distortion type_id="Opencv-Distortion">
<rows>2</rows>
<cols>1</cols>
<data>-0.0601982111953816 0.1307347481452408 </data>
</Distortion>
<Rotation type_id="Opencv-Rotation">
<rows>3</rows>
<cols>3</cols>
<imgNum>22</imgNum>
<data>-0.94216 -0.08345 0.32462 0.02031 -0.98095 -0.19321 0.33456 -0.17544 0.92590 </data>
</Rotation>
<TranslationVector type_id="Opencv-TranslationVector">
<rows>3</rows>
<cols>1</cols>
<imgNum>22</imgNum>
<data>671.6897 195.2475 2951.0166 </data>
</TranslationVector>
</opencv_storage>
注意
- 生成的内参矩阵需要转置
- 生成的外参旋转矩阵需要转置
- 生成的外参平移向量顺序为:Tx,Ty,Tz
最后
以上就是温柔御姐为你收集整理的MATLAB单目相机标定的使用并导出XML文件前言省略的标定工作。。。参数导出XML生成的XML文件注意的全部内容,希望文章能够帮你解决MATLAB单目相机标定的使用并导出XML文件前言省略的标定工作。。。参数导出XML生成的XML文件注意所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复