目录

  • 学习 opencv 自带示例 stereo_calib(立体相机标定)
    • 准备
    • 调试示例代码
      • 目标工程
      • 确定输入参数类型
      • 调试模式(debug)输入参数
      • F5 调试
      • 程序执行完毕(输出项目)
    • 内外参数据说明
    • 学习(TODO)
    • 参考

学习 opencv 自带示例 stereo_calib(立体相机标定)

准备

首先,需要编译 opencv 自带示例,可以参考之前的博客记录:
cmake+windows 编译 opencv 自带示例.

调试示例代码

目标工程

确定输入参数类型

/// 参数:
/// @ w:棋盘格(圆形)标定板的长边角点数目,对于 12x9 的棋盘格,w = 11
/// @ h:棋盘格(圆形)标定板的短边角点数目,对于 12x9 的棋盘格,h = 8
/// @ s:棋盘格方格尺寸,单位 cm
/// @ nr:no rectified: 如果加上这个参数,就不会显示矫正后的图像
/// @ help:命令行执行帮助提示
/// @ @input:保存标定图像集路径的 .xml 文件cv::CommandLineParser parser(argc, argv, "{w|9|}{h|6|}{s|1.0|}{nr||}{help||}{@input|stereo_calib.xml|}");
if (parser.has("help"))return print_help();
showRectified = !parser.has("nr");
imagelistfn = samples::findFile(parser.get<string>("@input"));
boardSize.width = parser.get<int>("w");
boardSize.height = parser.get<int>("h");
float squareSize = parser.get<float>("s");

调试模式(debug)输入参数

右键此项目,点击属性选项,进入项目的属性页面,在调试 --> 命令参数栏中输入参数,我的标定板尺寸为 12x9 (角点尺寸 11x8), 1.5cm

标定图像集路径 .xml 文件地址(如上图)&格式(如下)。
stereo_calib.xml(部分文件)

<?xml version="1.0"?>
<opencv_storage>
<imagelist>
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\left_1.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\right_1.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\left_2.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\right_2.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\left_3.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\right_3.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\left_4.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\right_4.png"
...
...
...
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\left_48.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\right_48.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\left_49.png"
"D:\M_MindVisionSDK_Clone\common_stereo_0702\common\build\calibration\image_pair\right_49.png"
</imagelist>
</opencv_storage>

F5 调试

图像的分辨率为1280x1024,一共 49 对(98张)图片,调试过程执行时间大约在 20+ 分钟左右(i5-9400F)。
标定开始(47对图像符合要求(找到角点)):

程序执行完毕(输出项目)

stereo_calib.cpp 执行完毕后会在命令行中显示输出,如果在程序执行前没有输入nr参数,此时就会显示每一对矫正后标定图像(包含裁剪区域,水平线);在stereo_calib.cpp源文件所在目录,也会生成内参(intrinsic.yml)与外参(extrinsic.yml) 文件。

命令行输出

矫正图像

内外参程序默认存储地址

内参 intrinsic.yml

%YAML:1.0
---
M1: !!opencv-matrixrows: 3cols: 3dt: ddata: [ 1.3241615532180620e+03, 0., 6.3819839672280261e+02, 0.,1.3248893276176391e+03, 5.1955679264247931e+02, 0., 0., 1. ]
D1: !!opencv-matrixrows: 1cols: 14dt: ddata: [ -1.1636352792431695e-01, 2.8974617123762275e-01, 0., 0., 0.,0., 0., 1.2908722457060287e-01, 0., 0., 0., 0., 0., 0. ]
M2: !!opencv-matrixrows: 3cols: 3dt: ddata: [ 1.3241615532180620e+03, 0., 6.3481565514416604e+02, 0.,1.3248893276176391e+03, 5.1084131542728164e+02, 0., 0., 1. ]
D2: !!opencv-matrixrows: 1cols: 14dt: ddata: [ -1.0253422568346042e-01, 1.8838231393096699e-01, 0., 0., 0.,0., 0., -3.7932170237531426e-02, 0., 0., 0., 0., 0., 0. ]

外参 extrinsic.yml

%YAML:1.0
---
R: !!opencv-matrixrows: 3cols: 3dt: ddata: [ 9.9999962469823134e-01, -8.6625827227159650e-04,-1.4142211807947691e-05, 8.6626849570826839e-04,9.9999935124684680e-01, 7.3965179573864872e-04,1.3501473146517586e-05, -7.3966376909856987e-04,9.9999972635757206e-01 ]
T: !!opencv-matrixrows: 3cols: 1dt: ddata: [ -7.9332505690605970e+00, -1.7537722400808173e-02,-5.2447786996653978e-01 ]
R1: !!opencv-matrixrows: 3cols: 3dt: ddata: [ 9.9782178211702999e-01, 1.2926754401776212e-03,6.5954682343262627e-02, -1.3199419700206951e-03,9.9999906048566101e-01, 3.6983914196800176e-04,-6.5954142295917270e-02, -4.5608990507940109e-04,9.9782255090572503e-01 ]
R2: !!opencv-matrixrows: 3cols: 3dt: ddata: [ 9.9781935509686992e-01, 2.2058396748603540e-03,6.5967180214069804e-02, -2.1862041633003604e-03,9.9999754186115819e-01, -3.6984185448794930e-04,-6.5967833869417944e-02, 2.2481763670781029e-04,9.9782172473423680e-01 ]
P1: !!opencv-matrixrows: 3cols: 4dt: ddata: [ 1.2570131053880084e+03, 0., 5.2801861572265625e+02, 0., 0.,1.2570131053880084e+03, 5.1521139144897461e+02, 0., 0., 0., 1.,0. ]
P2: !!opencv-matrixrows: 3cols: 4dt: ddata: [ 1.2570131053880084e+03, 0., 5.2801861572265625e+02,-9.9939932841530499e+03, 0., 1.2570131053880084e+03,5.1521139144897461e+02, 0., 0., 0., 1., 0. ]
Q: !!opencv-matrixrows: 4cols: 4dt: ddata: [ 1., 0., 0., -5.2801861572265625e+02, 0., 1., 0.,-5.1521139144897461e+02, 0., 0., 0., 1.2570131053880084e+03, 0.,0., 1.2577686112529091e-01, 0. ]

内外参数据说明

内参 intrinsic.yml

M1: cameraMatrix1 First camera matrix. (相机1矩阵)
D1: distCoeffs1 First camera distortion parameters.(distortion coefficient,相机1畸变系数)
M2: cameraMatrix2 Second camera matrix.(相机2矩阵)
D2: distCoeffs2 Second camera distortion parameters.(相机2畸变系数)

来源函数

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

外参 extrinsic.yml

R: @param R Rotation matrix between the coordinate systems of the first and the second cameras.(两相机坐标系的旋转矩阵)
T: @param T Translation vector between coordinate systems of the cameras.(两相机坐标系的平移向量)
R1: @param R1 Output 3x3 rectification transform (rotation matrix) for the first camera.(相机1的3x3整流变换(旋转矩阵))
R2: @param R2 Output 3x3 rectification transform (rotation matrix) for the second camera.(相机2的3x3整流变换(旋转矩阵))
P1: @param P1 Output 3x4 projection matrix in the new (rectified) coordinate systems for the first camera.(相机1对于新坐标系的(调整后的)投影矩阵)
P2: @param P2 Output 3x4 projection matrix in the new (rectified) coordinate systems for the second camera.(相机2对于新坐标系的(调整后的)投影矩阵)
Q: @param Q Output 4x4 disparity-to-depth mapping matrix (see reprojectImageTo3D ).(4X4视差 到 深度映射矩阵)

来源函数

CV_EXPORTS_W void stereoRectify( InputArray cameraMatrix1, InputArray distCoeffs1,InputArray cameraMatrix2, InputArray distCoeffs2,Size imageSize, InputArray R, InputArray T,OutputArray R1, OutputArray R2,OutputArray P1, OutputArray P2,OutputArray Q, int flags = CALIB_ZERO_DISPARITY,double alpha = -1, Size newImageSize = Size(),CV_OUT Rect* validPixROI1 = 0, CV_OUT Rect* validPixROI2 = 0 );

学习(TODO)

参考

  1. 链接: cmake+windows 编译 opencv 自带示例.
  2. 链接: link.

学习 opencv 自带示例 stereo_calib(立体相机标定)相关推荐

  1. Opencv立体相机标定

    0. 简要 立体相机标定是立体视觉深度测量的重要步骤,相机标定的精度很大程度上决定了深度的精度,因此掌握立体相机的标定算法和过程至关重要.由于相机标定原理可以在网上找到很多相关资料,因此本文不展开讲原 ...

  2. 基于OpenCV的立体相机标定StereoCalibration与目标三维坐标定位

    说明:以下涉及到的一些公式以及图片来自于Learning OpenCV. 做了快2个月的立体相机标定,遇到了一些问题,也有了一些体会,在这里记下来. 1.在做立体相机标定的时候,标定板的规范与否直接影 ...

  3. 如何用OpenCV制作一个低成本的立体相机

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:3D视觉工坊 AR/VR的兴起,让我们喜欢上了3D电影 ...

  4. 立体相机标定数据集_超全的3D视觉数据集汇总

    作者:Tom Hardy Date:2019-12-31 文章来源:超全的3D视觉数据集汇总 1.KITTI数据集 KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最 ...

  5. OpenCV | 基于OpenCV的双目图像采集源代码(相机标定)

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 ================= ...

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

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

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

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

  8. 张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)

    from:https://blog.csdn.net/dcrmg/article/details/52939318 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么 ...

  9. 学习OpenCV3 面阵相机标定方法

    使用OpenCV实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些? 相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的 ...

  10. 相机标定+鸟瞰图生成(VS2017+OpenCV)

    一.要求: 1.用自己的手机采集棋盘板定标数据: 2.实现或调用 角点检测.局部特征提取.局部特征匹配算法,标定自己手机的内参: 3.改变外参,生成不同视角的新图像. 二.实验过程: 1.实验前准备: ...

最新文章

  1. Servlet的基本架构
  2. MyBatis Like
  3. Codeforces Good Bye 2016 题解
  4. Ext 入门 (05) 打印+gridpanel()方法
  5. grep v grep_使用grep4j轻松测试分布式组件上的SLA
  6. MYSQL8 度分秒(DMS)转度(DDD)函数编写实战
  7. 本地wamp的Internal Server Error错误解决方法
  8. Hadoop入门基础教程 Hadoop之服务器基础环境搭建
  9. java linklist 遍历_Java LinkList遍历方式
  10. “System.InvalidOperationException”类型的未经处理的异常在 ESRI.ArcGIS.AxControls.dll 中发生...
  11. 微软商店点下载没反应
  12. 学生时代的经历,利用Python在机房杀红蜘蛛,脱离老师控制!
  13. 苹果8a1660是什么版本_苹果7a1660是什么版本
  14. 儒略日(CSP S2 第一题)
  15. 计算机怎么样返回桌面,电脑如何快速返回桌面
  16. 头条校招(今日头条2017秋招真题)1——python解法
  17. 部分特定领域的信息化检测管理要求和获认可机构目录
  18. 过去66年的66项最佳发明(1964~1993)
  19. 使用jQuery 快速高效制作 网页特效
  20. FOMO3D的超万倍奖金,自导自演or黑天鹅事件?

热门文章

  1. html广告飘窗,一个JS解决所有的飘窗广告
  2. iOS打包静态库(完整篇)
  3. 格西烽火 串口助手(一)
  4. Redis -- 羊哥CodeSheep20题(转发)
  5. 医学软件项目开发(二):医学图像的显示及相关操作
  6. ESD笔记(一)_ESD基础
  7. 树莓派3b+指南(二十二)暴力解决默认声卡设置失效问题
  8. 地铁FAS设备组成及系统结构
  9. 想用linux又想windows,Linux对Windows说:停止吵架,和平共处
  10. poppin_xpower_ 常城