机器视觉学习笔记(7)——基于OpenCV的双目摄像机标定

标签: 机器视觉

本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译)

阅读本文之前请先阅读以下三篇博文:
机器视觉学习笔记(4)——单目摄像机标定参数说明
机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定
机器视觉学习笔记(6)——双目摄像机标定参数说明


1.双目摄像机标定目的

双目摄像机标定最主要的目的就是要得出左右两个摄像机的相对位置关系,但是在OpenCV中,计算表示左右摄像机位置的矩阵R和T的同时,也可以求出每个摄像机的相机内参数矩阵M和畸变系数矩阵D。

2.Q&A

Q1:双目标定之前需要单目标定吗?

A:推荐先进行单目标定,但不是必须,具体取决于精度要求以及程序实现方式。OpenCV中双目标定的关键函数是double stereoCalibrate()

double stereoCalibrate(InputArrayOfArrays objectPoints,InputArrayOfArrays imagePoints1,InputArrayOfArrays imagePoints2,CV_OUT InputOutputArray cameraMatrix1,CV_OUT InputOutputArray distCoeffs1,CV_OUT InputOutputArray cameraMatrix2,CV_OUT InputOutputArray distCoeffs2,Size imageSize, OutputArray R,OutputArray T, OutputArray E, OutputArray F,TermCriteria criteria =TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6),int flags=CALIB_FIX_INTRINSIC );

该函数最后一个参数flags表示参数中标定矩阵的一些限定:

  • 默认的参数是CV_CALIB_FIX_INTRINSIC,该参数表示cameraMatrix1distCoeffs1cameraMatrix2distCoeffs2这4个矩阵已经是准确值了,不需要再计算了。即单独对两个摄像机标定后,选择默认参数即可
  • 其它的参数表示在某种限定情况下计算cameraMatrix1distCoeffs1cameraMatrix2distCoeffs2这4个矩阵。例如官方文档推荐的CV_CALIB_SAME_FOCAL_LENGTH | CV_CALIB_ZERO_TANGENT_DIST,表示强制左右摄像机的fxf_xfx​和fyf_yfy​相等,左右摄相机切向畸变系数为零
  • 虽然在别的博客和官方文档中看到直接使用double stereoCalibrate()一次标定所有的参数会有较大的误差,但是根据博主的实验,效果相差也不是很大。实际TxT_xTx​是62mm,先单目后双目结果为62.2mm,双目一次标定结果为62.3mm
  • 由于标定摄像机还需要提取角点,记录标定点在{world}坐标系下的坐标等辅助操作,而封装好单目标定类的话,单目标定双目标定都好用,所以博主采取的方法是先单目分别标定,再双目标定

Q2:双目标定几张图像合适?

A:博主从10+到40+都试了,感觉图像张数对于精度的影响没有想象中的大,一般左右相机的图像加起来一共30张左右就差不多了。最重要的是图像中标定板与相机的相对位姿,一般要让标定板占据整张图像一半左右的面积,并且标定板相对于相机要有正视,俯视,仰视,左斜视和右斜视等姿态

Q3:标定板的黑白格大小与程序有什么关系?

A:因为单目相机无法检测物体的深度信息,所以单目相机的标定板黑白格大小可以随意指定却不影响单目标定的结果,每一个{world}点的坐标以黑白格的边长为x,y方向的单位向量。但是双目系统需要检测物体的深度信息,而深度信息的单位就是{world}坐标系下的坐标单位,所以在输入{world}的点时,需要说明其在{world}下的具体坐标,我们把{world}原点定在标定板的左上角(此时所有点的Z坐标为0),标定板的黑白格边长为squareSize

const double squareSize = 20.64;//mm
for (int i=0; i<boardSize.height; i++)for (int j=0; j<boardSize.width; j++)objectCorners.push_back(cv::Point3f(i * squareSize, j * squareSize, 0.0f));

Q4:标定时拍摄的照片有什么要求吗?

A:标定时的照片必须是左右相机同时拍摄的,因为只有同时拍摄才能得到同一物理点在左右相机图像平面上的投影。有一个检测相机是否同步的好方法,那就是打开手机的秒表,然后同时拍照,这样就知道拍照的时间差了。还需要注意的是double stereoCalibrate()参数中物理点和图像点顺序必须保持一致。

Q5:如何自动载入和保存图片?

A:使用一个vector<string>变量保存保存图片的路径和名称信息即可,使用下面的函数生成路径和名称信息:

void generate_image_filename(string filePath, int imageCount, vector<string>& fileList)
{Mat image;for (int i=1; i<=imageCount; i++){std::stringstream str;str << filePath << std::setw(2) << std::setfill('0') << i << ".jpg";//图片的相对路径fileList.push_back(str.str());}
}

3.标定结果分析

此处主要分析R和T矩阵,我的标定结果如下:

  • T矩阵描述了左右摄像机{camera}坐标原点的相对关系,x方向实际62mm,测得62.28mm,精度基本满足要求
  • R矩阵描述了左右摄像机{camera}坐标轴的相对关系,试验的左右相机{camera}坐标系位姿几乎相同,根据机器人学的知识,基本应该是[[100]T,[010]T,[001]T][[1 0 0]^T, [0 1 0]^T, [0 0 1 ]^T][[100]T,[010]T,[001]T]的形式
  • 可以看出左相机M矩阵标定还是有问题,可以增加不同位置的图像进行优化
  • 博主使用的是普通摄像头,如果使用工业相机,同样的方法可以将精度提高至少一个数量级
  • 其实fx,fyf_x, f_yfx​,fy​也是可以算出来的,fyf_yfy​应该在1250左右,只不过略微麻烦而已

4.总结

  • 虽然单双目标定的流程其实已经固定化了,但是操作的方法会影响标定的最终精度
  • 标定是否正确可以通过TxT_xTx​(左右相机光轴的距离)直接看出来
  • 以下措施都可以提高精度:
    • 使用高分辨率的工业相机
    • 先单目标定,再双目标定
    • 标定的图像中标定板要占据一半左右的面积
    • 两台摄像机的拍照时间要尽量同步,尤其是在运动中
    • 标定板的黑白格大一些,测量多个黑白格长度取平均值
    • 标定的图像多一些,标定板的位姿多一些

机器视觉学习笔记(7)——基于OpenCV的双目摄像机标定相关推荐

  1. 机器视觉学习笔记(4)——单目摄像机标定参数说明

    机器视觉学习笔记(4)--单目摄像机标定参数说明 标签: 机器视觉 1.针孔摄像机模型 在介绍摄像机标定参数之前,需要先简单说一下针孔摄像机的原理.投影平面到小孔的距离为焦距f,物体到小孔的距离为Z, ...

  2. 【opencv学习】完全基于opencv的双目景深与测距的实现

    目录 目录 说明 双目测距原理 opencv实现双目测距的原理 双目测距代码说明 双目测距的代码和实现 接下来 1 说明 怕以后忘了,现在总结一下前一段时间一直在弄的,有关双目视觉的东西. 双目视觉的 ...

  3. 学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距).

    装载:https://www.cnblogs.com/daihengchen/p/5492729.html 最近在做双目测距,觉得有必要记录点东西,所以我的第一篇博客就这么诞生啦~ 双目测距属于立体视 ...

  4. 学习笔记之——基于深度学习的图像超分辨率重建

    最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...

  5. C#入门学习笔记(基于刘铁锰老师C#入门2014教学视频)【1】

    C#入门学习笔记(基于刘铁锰老师C#入门2014教学视频)[1] 前言: 本笔记作为记录我从零开始学习C#的记录,为了unity的兴趣爱好自学一门C#,也算是寒假为自己充个电,希望这个寒假可以坚持下去 ...

  6. C#入门学习笔记(基于刘铁锰老师C#入门2014教学视频)【2】

    C#入门学习笔记(基于刘铁锰老师C#入门2014教学视频)[2] 初识类和名称空间 前言: 本笔记作为记录我从零开始学习C#的记录,为了unity的兴趣爱好自学一门C#,也算是寒假为自己充个电,希望这 ...

  7. 【图神经网络】图神经网络(GNN)学习笔记:基于GNN的图表示学习

    图神经网络GNN学习笔记:基于GNN的图表示学习 1. 图表示学习 2. 基于GNN的图表示学习 2.1 基于重构损失的GNN 2.2 基于对比损失的GNN 参考资料 本文主要就基于GNN的无监督图表 ...

  8. 12864液晶深入学习笔记_1——基于msp430g2553

    12864液晶学习笔记 Created on: 2012-8-30 Author: zhang bin 这是我对12864的学习笔记,12864液晶功能很全面,使用起来也很方便,能够满足一般的研究和工 ...

  9. 学习笔记之——基于matlab的数字通信系统(2)之离散信号的傅里叶分析

    关于连续信号的傅里叶分析,可以参考博文<学习笔记之--基于matlab的数字通信系统(1)&连续信号的傅里叶分析> 目录 离散时间信号的傅里叶变换(DTFT) 连续时间信号的抽样- ...

  10. 【QT学习笔记】基于QT的天气预报

    [QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...

最新文章

  1. 那些jdk中坑你没商量的方法
  2. npm package.json文件中的依赖关系,devDependencies和peerDependencies之间有什么区别?
  3. document 文挡对象 - JavaScript脚本语言描述
  4. Kyoya and Photobooks
  5. svm机器学习算法_SVM机器学习算法介绍
  6. 任正非:只有教师待遇得到提升 教育才会较大发展
  7. dorado-初学1
  8. centos-修改分辨率
  9. Tasty项目经验总结(不断补充中)
  10. autojs刷网课之一、刷视频篇
  11. 安装netframewo酷比魔方平板电脑一键Root教程
  12. kali自定义分辨率
  13. 增长率方程用c语言,听宋志晓老师讲解资料分析中的隔年增长率公式(04.04)
  14. 手撕IP核系列——Xilinx FIFO IP核-异步FIFO
  15. 网站SEO优化的关键词密度怎么布局才算合理
  16. Android应用优化之冷启动优化
  17. fastboot简介(android烧录指令)
  18. Task5 | CFA (Amos+Mplus) | 五因素心智觉知度量表:正念是什么?
  19. 中国茶叶分类图(转载)
  20. angular报错信息之 'zmz-select' is not a known element

热门文章

  1. 全国信息流广告优化师交流群,不容错过!赶紧加入!
  2. fiddler+mitmproxy+夜神模拟器安装
  3. du -c 单位 linux,Linux命令 du
  4. 车载芯片分类、用途、供应商
  5. 解决uni-app小程序获取路由及路由参数
  6. Java基础每日一练—第6天:逻辑判断
  7. 通过二进制逻辑运算解题
  8. 高等数学---第八章多元函数微分学---多元函数的极值与最值
  9. 突发奇想的分享一张Windows经典图片
  10. qt 获取本地文件夹、文件路径