我是靠谱客的博主 温柔御姐,最近开发中收集的这篇文章主要介绍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>

注意

  1. 生成的内参矩阵需要转置
  2. 生成的外参旋转矩阵需要转置
  3. 生成的外参平移向量顺序为:Tx,Ty,Tz

最后

以上就是温柔御姐为你收集整理的MATLAB单目相机标定的使用并导出XML文件前言省略的标定工作。。。参数导出XML生成的XML文件注意的全部内容,希望文章能够帮你解决MATLAB单目相机标定的使用并导出XML文件前言省略的标定工作。。。参数导出XML生成的XML文件注意所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部