相机标定、双目相机标定(原理)、三维重建效果展示

2023-05-16

1.相机标定的目的:

 (1)通过单目相机标定分别求出左右相机的内参数和外参数。

(2)矫正由于镜头畸变造成的图片的变形,例如,现实中的直线,拍摄成图像后会外凸或内凹,进行相机标定后可以对这种情况进行校正;

(3)利用分别对左右相机标定得到的参数进行双目标定,通过计算得到深度和位置信息,从而进行三维重建和测距等。 

2.四个坐标系

        相机标定的目的之一是为了建立物体从三维世界到成像平面上各坐标点的对应关系,所以首先要了解以下四个坐标系:

世界坐标系:用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置以及相机所在的位置而被引入。

相机坐标系:在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。

图像坐标系:为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。

像素坐标系:为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系,单位为个(像素数目)。

3.坐标之间的转换

世界坐标系:XwYwZw

相机坐标系: XcYcZc

图像坐标系:xy

像素坐标系:uv

        其中,相机坐标系的Z轴与光轴重合,且垂直于图像坐标系平面并通过图像坐标系的原点,相机坐标系与图像坐标系之间的距离为焦距f。像素坐标系平面u-v和图像坐标系平面x-y重合,但像素坐标系原点位于图中左上角。

3.1世界坐标系到相机坐标系

假设绕x轴旋转(逆时针)

以此类推,绕其它轴旋转(顺时针)

世界坐标系到相机坐标系要6个自由度,除了旋转还要进行平移

3.2相机坐标系转图像坐标系

3.3图像坐标系转像素坐标系

图像坐标系的原点在图像的中央,单位mm

像素坐标系的原点在图像的左上角,单位是像素Pixel(个)。

dx,dy:是传感器固有的参数,代表每个像素的毫米数。

u0,v0:代表图像坐标系原点相对于像素坐标系的偏移量,单位是像素。

3.4 世界坐标系到像素坐标系转换的全过程

 至此,要想通过拍摄到的二维图像重建三维场景,那么就要求得内参M1和外参M2。

 3.5张正友标定法

 

 

 

单应性(Homography)变换。可以简单的理解为它用来描述物体在世界坐标系和像素坐标系之间的位置映射关系。对应的变换矩阵称为单应性矩阵。

 

 

 

如何根据标定图得到单应矩阵?

经过前面一系列的介绍,我们应该大致明白如何根据打印的棋盘标定图和拍摄的照片来计算单应矩阵H。我们来总结一下大致过程。

1. 打印一张棋盘格标定图纸,将其贴在平面物体的表面。

2. 拍摄一组不同方向棋盘格的图片,可以通过移动相机来实现,也可以移动标定图片来实现。

3. 对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点(角点,也就是下图中黑白棋盘交叉点,中间品红色的圆圈内就是一个角点,四个对角(红黄蓝绿)是最特别的角点)。我们定义打印的棋盘图纸位于世界坐标系Zw=0的平面上,世界坐标系的原点位于左图棋盘图纸的固定一角(比如下图中黄色点)。像素坐标系原点位于右图图片左上角。

因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到这个视角下的单应矩阵H。当然计算单应矩阵一般不需要自己写函数实现,OpenCV中就有现成的函数可以调用。

但是,以上只是理论推导,在真实的应用场景中,我们计算的点对中都会包含噪声。比如点的位置偏差几个像素,甚至出现特征点对误匹配的现象,如果只使用4个点对来计算单应矩阵,那会出现很大的误差。因此,为了使得计算更精确,一般都会使用远大于4个点对来计算单应矩阵。另外上述方程组采用直接线性解法通常很难得到最优解,所以实际使用中一般会用其他优化方法,如奇异值分解、Levenberg-MarquaratLM)算法

通过以上方法求得的单应性矩阵H后,以下是通过H反推相机的内外参

通过上面2.28与2.29得:

 ​​​

  可以自行计算B为对角矩阵,所以B只有6个未知数,所以向量b设置6个参数即可

 

第二部分 立体标定、立体校正与立体匹配

立体(双目)标定

        分别对双目的每个相机标定获得的外参通过代换推导得到双目相机中两个摄像头之间的相对位置关系。最终分别得到二者相对同一坐标系的旋转矩阵R和平移矩阵T能够使两个相机重合的过程。

立体校正(极线矫正)

        立体校正的目的就是,利用立体标定所获得的参数将实际非共面行对准的两幅图像,校正成共面行对准。当两个图像平面是完全共面行对准时,立体匹配的效率更高且计算立体视差是最简单的。因为当两个图像平面是完全共面行对准时,立体匹配从二维搜索降至一维搜索,并且可以过滤掉无匹配点。但是,在现实的双目立体视觉系统中,是不存在完全的共面行对准的两个摄像机图像平面的,所以我们要进行立体校正(共面行对准是指:两摄像机图像平面在同一平面上,且同一点投影到两个摄像机图像平面时,应该在两个像素坐标系的同一行

校正:W是物点,M1,M2是投影点。最终实现R1,R2共平面且M1,M2两个像素坐标系在同一行立体

 

                                立体校正前

 

                                立体校正后

立体匹配(特征匹配、视差计算)

利用相似三角形原理

                  

化简后

                  

令视差d=xl-xr

                  

        保证左右相机进行深度感知的目标是同一个对象的像素点,例如的最优匹配点是。左右相机对同一个对象的像素点才能准确的利用视差计算出目标的深度信息。有诸多困难,如可能拍摄到的特征点模糊,可能有单个相机没拍摄到同一对象,所以匹配算法很重要。

利用SGM做匹配的步骤,匹配方法如上所述,右视图中与左视图待测像素同一水平线上相关性最高的即为最优匹配。完成匹配后,我们需要记录其视差d,由深度计算公式已知,即可算出深度

给定视差图、基线和焦距,三角测量计算3D空间中对应的位置

 

最后,三维重建效果展示:

(a)普通双目相机

 (b)拍摄棋盘格

(c)三维重建效果

部分图片来自B站视频截图,欢迎交流学习。

本篇博客的完整内容可下载:单目、双目相机的标定原理以及图解_双目视觉标定原理-行业报告文档类资源-CSDN下载

强烈建议看这个文章:相机标定之张正友标定法数学原理详解(含python源码) - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相机标定、双目相机标定(原理)、三维重建效果展示 的相关文章

随机推荐

  • “小身材,大智慧”——STM32 NUCLEO-F031K6测评(一)

    原文地址 http bbs eeworld com cn thread 479351 1 1 html 相关文章 1 NUCLEO F031K6 https blog csdn net wowocpp article details 826
  • 使用STM32F103CBT6自制ST LINK V2-1多功能烧录器

    基于STM32的ST LINK V 2 1多功能烧录器制作 前 言根据官方相关文档可知 ST LINK V2 1拥有以下四大功能 xff1a ST LINK V2 1制作教程和资料说明主空部分原理图 xff08 参考 xff09 xff1a
  • 分享几个可用的在线运行Linux 脚本网站

    1 codingground 代码域 访问链接 xff1a https www tutorialspoint com unix terminal online php 直接打开就可以操作了 xff0c 练习非常方便 2 jor1k 访问链接
  • STM32开发记录三: 硬件IIC调试(STHC3温湿度传感器)

    一 STM32 CubeMX配置 I2C4 init function void MX I2C4 Init void hi2c4 Instance 61 I2C4 hi2c4 Init Timing 61 0x20A0C4DF hi2c4
  • openmv中模块解析

    模块解析 1 sensor摄像头模块 xff1a 包含了感光芯片与图像预处理的各项操作 sensor reset 重置并初始化OpenMV sensor set pixformat sensor RGB565 选择颜色空间与像素格式RGB5
  • 视觉SLAM——位姿估计

    看完位姿估计原理过一段时间又忘记了 xff0c 现参考高翔视觉SLAM十四讲做本文笔记 SLAM中的里程计都是基于特征点方式的算法 1 特征匹配 特征匹配是视觉SLAM中极为关键的一步 它解决了数据关联问题 通过图像与图像或图像与地图间描述
  • 工业相机的术语相关

    一 工业相机术语 像素 xff08 pixel xff09 xff1a 图像上的最小组成单元 图像由小方格即像素组成的 xff0c 这些小方块都有一个明确的位置和被分配的色彩数值 xff0c 小方格颜色和位置就决定该图像所呈现出来的样子 像
  • C++学习笔记(二)

    1 C 43 43 简介 参考C 43 43 菜鸟教程 C 43 43 是一种静态的编译式的通用的大小写敏感的不规则的编程语言 xff0c 支持过程编程 对象编程和泛型编程 C 43 43 综合了高级语言和低级语言的特点 xff0c 是一种
  • Ubuntu 16.04 ifconfig输出ens33,不能联网问题的解决

    VM 12 0 ubuntu 16 04 问题 xff1a 在NAT模式下联网的设置见前一个博文 xff0c 又在同一台电脑下安装ubuntun16 04虚拟机 xff0c 不能联网 xff0c 用ifconfig时输出如下 xff1a 并
  • C++:internal compiler error解决

    编绎文件时 xff0c 出现这个问题原因一般就是内存不够 xff0c 若是在虚拟机上 xff0c 关掉虚拟机 xff0c 可直接调节虚拟机内存大小 xff0c 然后重新启动即可
  • Error: Could not find the following Boost libraries:boost_serialization

    Boost 1 59 0 CMake 3 7 2 使用CMake编译时出现以下错误 xff1a 无法找到以下库 xff0c 但是编译好的库中是有libboost serialization libboost system等这些文件的 xff
  • ubuntu下make时对XX未定义的引用

    Q1 库对XX未定义的引用 xff0c 如 xff1a Thirdparty vio g2o lib libvio g2o so xff1a 对 39 IMUErrorModel lt ceres Jet lt double 38 gt g
  • Birch算法介绍

    目录 前言 一 Birch算法基本思想 二 聚类特征CF和CF 树 1 聚类特征CF 2 CF tree 3 CF tree 的生成 三 Birch算法流程 1 birch算法的优化 2 算法优缺点 四 算法实验实例 1 研究不指定簇数的情
  • [转]伪代码的写法

    伪代码的写法 xff08 附 xff1a 12种排序算法详解 xff09 转自 xff1a http blog sina com cn s blog 134451adb0102wfgu html 伪代码 xff08 Pseudocode x
  • linux C++调用python3的程序

    环境 xff1a ubuntu1404 python3 4 3 首先安装对应python不同版本的调用库 sudo apt get install python3 4 dev xff0c python脚本基本不用变 xff0c 在C 43
  • Bug 记录

    Bug记录 CocosCreator打包出现 Error xff1a Program type already present android support v4 os ResultReceiver MyResultReceiver 解决
  • I2C通信

    I2 C 芯片间 总线接口连接微控制器和串行 I 2 C 总线 它提供多主机功能 xff0c 控制所有 I 2 C 总线特定的 时序 协议 仲裁和定时 1 xff0c 物理层 1 IIC是一种两线串行的通信方式 xff0c SCL xff0
  • 使用Mybatis-Plus代码生成器的报错解决

    使用Mybatis Plus的同学 xff0c 在使用代码生成器的时候不知道有没有遇到过这个问题 xff1a 21 36 23 829 main DEBUG com baomidou mybatisplus generator AutoGe
  • Debian之安装完成后找不到命令解决办法

    1 修改配置文件 bashrc vim root bashrc export PATH 61 PATH usr sbin 2 使配置文件生效 source root bashrc
  • 相机标定、双目相机标定(原理)、三维重建效果展示

    1 相机标定的目的 xff1a xff08 1 xff09 通过单目相机标定分别求出左右相机的内参数和外参数 xff08 2 xff09 矫正由于镜头畸变造成的图片的变形 xff0c 例如 xff0c 现实中的直线 xff0c 拍摄成图像后