注意事项

  1. OpenCV中畸变参数的排列顺序为 [ k 1 , k 2 , p 1 , p 2 , k 3 , ⋯ ] [k_1,k_2,p_1,p_2,k_3,\cdots] [k1​,k2​,p1​,p2​,k3​,⋯],提取Matlab相机标定结构数据中的畸变参数时,顺序必须与其一致;
  2. 提取Matlab相机标定结构数据中的旋转矩阵时,需要进行转置(或求逆)。

0 FileStorage类读取xml文件

cv::FileStorage file_storage("xml_path.xml", cv::FileStorage::READ);
file_storage["LeftIntrinsics"] >> mat33d_left_intrinsics;
file_storage["LeftDistortionCoeffs"] >> mat51d_left_distort_coeffs;
file_storage["RightIntrinsics"] >> mat33d_right_intrinsics;
file_storage["RightDistortionCoeffs"] >> mat51d_right_distort_coeffs;
file_storage["Translation"] >> mat31d_cam_translation;
file_storage["Rotation"] >> mat33d_cam_rotation;

1 手动标定工具箱

1.1 单目标定

% 该脚本文件用于将由老版本Matlab标定工具箱(手动提取标定板角点)
% 标定获取的相机标定数据转换成能够被OpenCV FileStorage类读取的“.xml”格式文件
% 文件默认保存路径为当前工作目录,可修改路径% 将标定获取的数据存入IntrinsicsMatrix和DistCoeffMatrix两个矩阵中
IntrinsicsMatrix = zeros(3, 3);
IntrinsicsMatrix(1, 1) = fc(1);
IntrinsicsMatrix(2, 2) = fc(2);
IntrinsicsMatrix(1, 3) = cc(1);
IntrinsicsMatrix(2, 3) = cc(2);
IntrinsicsMatrix(3, 3) = 1;
DistCoeffMatrix = kc;% 生成根节点“opencv_storage”
xmldoc = com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
xmlroot = xmldoc.getDocumentElement;%% 在根节点“opencv_storage”下生成二级子节点“Intrinsics”
Intrinsics = xmldoc.createElement('Intrinsics');
xmlroot.appendChild(Intrinsics);
Intrinsics.setAttribute('type_id','opencv-matrix');
% 在二级子节点“Intrinsics”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Intrinsics.appendChild(rows);
% 在二级子节点“Intrinsics”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Intrinsics.appendChild(cols);
% 在二级子节点“Intrinsics”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Intrinsics.appendChild(dt);
% 在二级子节点“Intrinsics”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3for j = 1 : 3data.appendChild(xmldoc.createTextNode(sprintf('%f', IntrinsicsMatrix(i, j))));if((i == 3) && (j == 3))break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    end
end
Intrinsics.appendChild(data);%% 在根节点“opencv_storage”下生成二级子节点“Distortion_Coefficients”
Distortion_Coefficients = xmldoc.createElement('Distortion_Coefficients');
xmlroot.appendChild(Distortion_Coefficients);
Distortion_Coefficients.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“Distortion_Coefficients”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
Distortion_Coefficients.appendChild(rows);
% 在二级子节点“Distortion_Coefficients”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 5)));
Distortion_Coefficients.appendChild(cols);
% 在二级子节点“Distortion_Coefficients”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Distortion_Coefficients.appendChild(dt);
% 在二级子节点“Distortion_Coefficients”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 5data.appendChild(xmldoc.createTextNode(sprintf('%f', DistCoeffMatrix(k))));if(k == 5)break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));
end
Distortion_Coefficients.appendChild(data);str = strcat('MonoCalibration', '.xml');
xmlwrite(str, xmldoc);

2 Matlab R2015a

2.1 单目标定

% 该脚本文件用于将由Matlab R2015a标定工具箱(自动提取标定板角点)
% 标定获取的单目相机标定数据转换成能够被OpenCV FileStorage类读取的“.xml”格式文件
% 文件默认保存路径为当前工作目录,可修改路径% 将标定获取的数据存入IntrinsicMatrix和DistCoeffMatrix两个矩阵中
IntrinsicMatrix = cameraParams.IntrinsicMatrix';
DistCoeffMatrix = zeros(1, 5);
DistCoeffMatrix(1, 1) = cameraParams.RadialDistortion(1);
DistCoeffMatrix(1, 2) = cameraParams.RadialDistortion(2);
DistCoeffMatrix(1, 3) = cameraParams.TangentialDistortion(1);
DistCoeffMatrix(1, 4) = cameraParams.TangentialDistortion(2);
if(cameraParams.NumRadialDistortionCoefficients == 3)DistCoeffMatrix(1, 5) = cameraParams.RadialDistortion(3);
end% 生成根节点“opencv_storage”
xmldoc = com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
xmlroot = xmldoc.getDocumentElement;%% 在根节点“opencv_storage”下生成二级子节点“Intrinsics”
Intrinsics = xmldoc.createElement('Intrinsics');
xmlroot.appendChild(Intrinsics);
Intrinsics.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“Intrinsics”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Intrinsics.appendChild(rows);
% 在二级子节点“Intrinsics”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Intrinsics.appendChild(cols);
% 在二级子节点“Intrinsics”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Intrinsics.appendChild(dt);
% 在二级子节点“Intrinsics”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3for j = 1 : 3data.appendChild(xmldoc.createTextNode(sprintf('%f', IntrinsicMatrix(i, j))));if((i == 3) && (j == 3))break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    end
end
Intrinsics.appendChild(data);%% 在根节点“opencv_storage”下生成二级子节点“DistortionCoeff”
DistortionCoeff = xmldoc.createElement('DistortionCoeff');
xmlroot.appendChild(DistortionCoeff);
DistortionCoeff.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“DistortionCoeff”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 5)));
DistortionCoeff.appendChild(rows);
% 在二级子节点“DistortionCoeff”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
DistortionCoeff.appendChild(cols);
% 在二级子节点“DistortionCoeff”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
DistortionCoeff.appendChild(dt);
% 在二级子节点“DistortionCoeff”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 5data.appendChild(xmldoc.createTextNode(sprintf('%f', DistCoeffMatrix(1, k))));if(k == 5)break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));
end
DistortionCoeff.appendChild(data);str = strcat('BinoCalibration', '.xml');
xmlwrite(str, xmldoc);

2.2 双目标定

% 该脚本文件用于将由Matlab R2015a标定工具箱(自动提取标定板角点)
% 双目标定获取的相机标定数据转换成能够被OpenCV FileStorage类读取的“.xml”格式文件
% 文件默认保存路径为当前工作目录,可修改路径% 将标定获取的左相机数据存入LeftIntrinsicMatrix和LeftDistCoeffMatrix两个矩阵中
LeftIntrinsicMatrix = stereoParams.CameraParameters1.IntrinsicMatrix';
LeftDistCoeffMatrix = zeros(1, 5);
LeftDistCoeffMatrix(1, 1) = stereoParams.CameraParameters1.RadialDistortion(1);
LeftDistCoeffMatrix(1, 2) = stereoParams.CameraParameters1.RadialDistortion(2);
LeftDistCoeffMatrix(1, 3) = stereoParams.CameraParameters1.TangentialDistortion(1);
LeftDistCoeffMatrix(1, 4) = stereoParams.CameraParameters1.TangentialDistortion(2);
if(stereoParams.CameraParameters1.NumRadialDistortionCoefficients == 3)LeftDistCoeffMatrix(1, 5) = stereoParams.CameraParameters1.RadialDistortion(3);
end% 将标定获取的右相机数据存入RightIntrinsicMatrix和RightDistCoeffMatrix两个矩阵中
RightIntrinsicMatrix = stereoParams.CameraParameters2.IntrinsicMatrix';
RightDistCoeffMatrix = zeros(1, 5);
RightDistCoeffMatrix(1, 1) = stereoParams.CameraParameters2.RadialDistortion(1);
RightDistCoeffMatrix(1, 2) = stereoParams.CameraParameters2.RadialDistortion(2);
RightDistCoeffMatrix(1, 3) = stereoParams.CameraParameters2.TangentialDistortion(1);
RightDistCoeffMatrix(1, 4) = stereoParams.CameraParameters2.TangentialDistortion(2);
if(stereoParams.CameraParameters2.NumRadialDistortionCoefficients == 3)RightDistCoeffMatrix(1, 5) = stereoParams.CameraParameters2.RadialDistortion(3);
end% 将标定获取的左右相机相对位姿数据存入TranslationMatrix和RotationMatrix两个矩阵中
TranslationMatrix = zeros(1, 3);
TranslationMatrix(1, 1) = stereoParams.TranslationOfCamera2(1);
TranslationMatrix(1, 2) = stereoParams.TranslationOfCamera2(2);
TranslationMatrix(1, 3) = stereoParams.TranslationOfCamera2(3);
RotationMatrix = stereoParams.RotationOfCamera2';% 生成根节点“opencv_storage”
xmldoc = com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
xmlroot = xmldoc.getDocumentElement;%% 在根节点“opencv_storage”下生成二级子节点“LeftIntrinsics”
LeftIntrinsics = xmldoc.createElement('LeftIntrinsics');
xmlroot.appendChild(LeftIntrinsics);
LeftIntrinsics.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“LeftIntrinsics”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
LeftIntrinsics.appendChild(rows);
% 在二级子节点“LeftIntrinsics”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
LeftIntrinsics.appendChild(cols);
% 在二级子节点“LeftIntrinsics”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
LeftIntrinsics.appendChild(dt);
% 在二级子节点“LeftIntrinsics”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3for j = 1 : 3data.appendChild(xmldoc.createTextNode(sprintf('%f', LeftIntrinsicMatrix(i, j))));if((i == 3) && (j == 3))break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    end
end
LeftIntrinsics.appendChild(data);%% 在根节点“opencv_storage”下生成二级子节点“LeftDistortionCoeffs”
LeftDistortionCoeffs = xmldoc.createElement('LeftDistortionCoeffs');
xmlroot.appendChild(LeftDistortionCoeffs);
LeftDistortionCoeffs.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“LeftDistortionCoeffs”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 5)));
LeftDistortionCoeffs.appendChild(rows);
% 在二级子节点“LeftDistortionCoeffs”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
LeftDistortionCoeffs.appendChild(cols);
% 在二级子节点“LeftDistortionCoeffs”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
LeftDistortionCoeffs.appendChild(dt);
% 在二级子节点“LeftDistortionCoeffs”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 5data.appendChild(xmldoc.createTextNode(sprintf('%f', LeftDistCoeffMatrix(1, k))));if(k == 5)break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));
end
LeftDistortionCoeffs.appendChild(data);%% 在根节点“opencv_storage”下生成二级子节点“RightIntrinsics”
RightIntrinsics = xmldoc.createElement('RightIntrinsics');
xmlroot.appendChild(RightIntrinsics);
RightIntrinsics.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“RightIntrinsics”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
RightIntrinsics.appendChild(rows);
% 在二级子节点“RightIntrinsics”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
RightIntrinsics.appendChild(cols);
% 在二级子节点“RightIntrinsics”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
RightIntrinsics.appendChild(dt);
% 在二级子节点“RightIntrinsics”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3for j = 1 : 3data.appendChild(xmldoc.createTextNode(sprintf('%f', RightIntrinsicMatrix(i, j))));if((i == 3) && (j == 3))break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    end
end
RightIntrinsics.appendChild(data);%% 在根节点“opencv_storage”下生成二级子节点“RightDistortionCoeffs”
RightDistortionCoeffs = xmldoc.createElement('RightDistortionCoeffs');
xmlroot.appendChild(RightDistortionCoeffs);
RightDistortionCoeffs.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“RightDistortionCoeffs”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 5)));
RightDistortionCoeffs.appendChild(rows);
% 在二级子节点“RightDistortionCoeffs”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
RightDistortionCoeffs.appendChild(cols);
% 在二级子节点“RightDistortionCoeffs”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
RightDistortionCoeffs.appendChild(dt);
% 在二级子节点“RightDistortionCoeffs”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 5data.appendChild(xmldoc.createTextNode(sprintf('%f', RightDistCoeffMatrix(1, k))));if(k == 5)break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));
end
RightDistortionCoeffs.appendChild(data);%% 在根节点“opencv_storage”下生成二级子节点“Translation”
Translation = xmldoc.createElement('Translation');
xmlroot.appendChild(Translation);
Translation.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“Translation”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Translation.appendChild(rows);
% 在二级子节点“Translation”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
Translation.appendChild(cols);
% 在二级子节点“Translation”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Translation.appendChild(dt);
% 在二级子节点“Translation”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 3data.appendChild(xmldoc.createTextNode(sprintf('%f',TranslationMatrix(1, k))));if(k == 3)break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));
end
Translation.appendChild(data);%% 在根节点“opencv_storage”下生成二级子节点“Rotation”
Rotation = xmldoc.createElement('Rotation');
xmlroot.appendChild(Rotation);
Rotation.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“Rotation”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Rotation.appendChild(rows);
% 在二级子节点“Rotation”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Rotation.appendChild(cols);
% 在二级子节点“Rotation”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Rotation.appendChild(dt);
% 在二级子节点“Rotation”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3for j = 1 : 3data.appendChild(xmldoc.createTextNode(sprintf('%f', RotationMatrix(i, j))));if((i == 3) && (j == 3))break;enddata.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    end
end
Rotation.appendChild(data);str = strcat('BinoCalibration', '.xml');
xmlwrite(str, xmldoc);

3 Matlab R2018b

单、双目标定同Matlab R2015a

相机标定参数Matlab转OpenCV格式脚本程序相关推荐

  1. matlab相机标定教学视频,相机标定入门教程【 OpenCV + Matlab】

    (单目)相机标定算法:张正友的算法 一些帖子对摄像头畸变原理的总结: http://www.baidu.com/link?url=Y-D_PIABMU-1VZsusDcBCMoFz-br4wg69tY ...

  2. 相机标定入门教程【 OpenCV + Matlab】

    (单目)相机标定算法:张正友的算法 paper:http://research.microsoft.com/~zhang/Papers/TR98-71.pdf 主页:http://research.m ...

  3. TSAI法相机标定(matlab)

    TSAI相机标定(matlab) 在做一维测量.三维测量之前,必须先对视觉系统进行标定:这里给出由matlab实现的TSAI标定方法,当然matlab里面也有自带的张正友标定法模块. 直接上代码: % ...

  4. 【计算机视觉】全景相机标定(MATLAB/opencv)

    全景相机标定 1Matlab工具箱 http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/links.html http://www-sop.i ...

  5. 相机标定(3) opencv中solvePnPRansac()和solvePnP()计算外参数

    SolvePnP bool solvePnP( InputArray objectPoints, InputArray imagePoints,InputArray cameraMatrix, Inp ...

  6. 相机标定问题-Matlab Py-Opencv

    一.相机标定基本理论 1.相机成像系统介绍 图中总共有4个坐标系: 图像坐标系:Op    坐标表示方法(u,v)                 Unit:Dots(个) 成像坐标系:Oi      ...

  7. matlab单目相机标定步骤,matlab相机标定

    本文是一篇关于相机标定意义和原理的个人总结,包含了 OpenCV 和 Matlab 中常用的相机 标定函数的注解. 相机标定是机器视觉的基础, 标定结果的好坏直接决定了机器...... 图片数量一定程 ...

  8. 双目相机标定流程(使用opencv采集图像、使用matlab标定相机参数)

    一.使用opencv采集双目图像 1.准备标准棋盘并打印 这里我们使用OpenCV提供的sample程序中的标定图片,图片位于opencv(C++版本)的安装路径:opencv\sources\sam ...

  9. 大恒相机标定with MATLAB

    相机参数 型号:Daheng MER-139-210U3C 标定步骤 固定相机位置,移动标定板,采集图片,大概100张左右. 示例图片: 打开MATLAB–Camera Calibrator 选择参数 ...

最新文章

  1. GAE Python 2009-3-22
  2. 服务端升级为select模型处理多客户端
  3. Halcon 记录1
  4. 手机能打开的表白代码_数据分析移动化:打开手机就能做分析
  5. 'unsigned char'-C编程中的声明,赋值和用法
  6. 在unity 中,使用http请求,下载文件到可读可写路径
  7. node.js应用生成windows server的plugin——winser
  8. 中国水痘带状疱疹感染治疗药物市场趋势报告、技术动态创新及市场预测
  9. OpenCV-Python实战(13)——OpenCV与机器学习的碰撞
  10. 全国计算机等级考试(NCRE)三级网络技术、四级网络工程师题库软件分享
  11. 【ctf-3】数论基础+Crypto初步
  12. redis如何解决远程连接失败
  13. 新浪免费企业邮箱Foxmail客户端设…
  14. Vue2.0源码解析 - 知其然知其所以然之Vue.use
  15. 龙泉寺贤超法师:用AI为古籍经书识别、断句、翻译
  16. html2day(合并单元格,有序、无序列表,input、select、textarea表单)
  17. 网络编程之:IP的ULONG方式字符串方式的相互转化
  18. 用python程序编写问卷调查_如何使用Python实现调查问卷的自动填写
  19. BBeditV10.0的注册码
  20. 移动物联网应用典型案例福建8项目入选,四信携手产业共赢

热门文章

  1. java走棋_Java五子棋实现
  2. 2019.4.19华为勇敢星实习之算法工程师(自然语言处理方向)面试经验(EE转CS)
  3. 《趣谈网络协议》00~04笔记
  4. [C]C语言中return 0和return 1和return -1
  5. 企业微信sdk调用,触发企业微信推送联系人列表
  6. 计算机cmd的如何进入文件夹以及如何返回上一级命令
  7. 计算机提示资源管理器停止,详细教您提示win资源管理器已停止工作
  8. MATLAB —— 强制终止关闭所有 EXCEL 进程
  9. 可以无线共享网络的好玩意
  10. 逆变器控制保护机制ASC和FW