在开始阅读前,我们首先要知道我们为什么要进行相机标定?开始需要输入什么?最后需要得到什么?
相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。

相机标定的输入:标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上)。

相机标定的输出:摄像机的内参、外参系数。

请在阅读全文的时候一定要记住这三点,否则会陷入零碎,而忘记“ 初心 ”,哈哈哈,言重了。

一、前言

最近在做零件的尺寸测量,由于精度要求,所以需要用到相机标定来消除畸变误差。网上查找了很多资料,看了好多数学公式理论的推导,看完也是有点虚,看的似懂非懂的。由于我是工科生,也没去深究太多的原理,对自己的要求是会使用,知道能达到什么要求即可。所以,我就按照自己的理解,尽量简单易懂一点,也便于以后的应用。如有不足或者错误之处请指出,还请指出。

二、摄像机模型

这部分是介绍相机模型的,比较劝退,我们后续用到的模型是针孔摄像机,因此大家知道针孔摄像机成像原理就行。

针孔摄像机成像原理示意图:

为了标定摄像机,我们有必要建立一个模型,该模型由摄像机、镜头和图像采集卡组成,这个模型可以将世界坐标系中三维空间点投影到二维图像中。再机器视觉应用中常用的有两种不同类型的镜头:普通镜头和远心镜头。使用普通镜头时,世界坐标系到图像坐标系的投影为透视投影。我们将摄像机与普通镜头的组合称为真空摄像机模型。远心镜头实现世界坐标系到图像坐标系的平行投影。我们称摄像机与远心镜头的组合为远心摄像机模型。

另外,还需要考虑两种不同的图像传感器:线阵图像传感器和面阵图像传感器。

三、投影几何

为什么要讲投影几何呢?

我们知道我们拍摄的物体在我们现实空间中是三维物体,用mm、cm、m等长度单位衡量,经过相机获取后变成了二维图像,我们利用函数对图像处理的时候就已经知道,图片的衡量单位变成了像素。因此我们要想得到现实空间下物体某个点对应图像中的哪个点,就需要建立一系列坐标系来建立它们之间的联系(莫嫌弃我啰嗦…)

我们都需要什么坐标系呢?

图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图:

构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点。
接下来的重点,就是关于这几个坐标系的转换。也就是说,一个现实中的物体是如何在图像中成像的。

3.1 图像坐标系与像素坐标系

像素坐标系 o-u-v图像坐标系 o-x-y 都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,也叫中心,通常情况下是成像平面的中点或者叫principal point。图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以这二者之间的转换如下:其中dx和dy表示每一列和每一行分别代表多少mm,即1pixel=dx mm

图像坐标系为什么这么建立后面会有解释 。

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

相机坐标系图像坐标系,属于透视投影关系,从3D转换到2D。相机坐标系相当于以小孔为原点建立的3D坐标系 Oc-Xc-Yc-Zc

由上方小孔成像图我们可以看出光线通过小孔在图像平面变成的图像是倒立的,这也可以知道我们上方的图像坐标系为什么那么建立了。然而我们现在要建立物体和图像的关系,这样看实在不方便,因此我们将图像平面等效变换到针孔平面前方,如下图:

这样小孔可以理解为光线汇聚点,称作投影中心。投影平面由倒立变成了正立了。

好,接下来我们就暴力求解图像坐标系 o-x-y相机坐标系 Oc-Xc-Yc-Zc 的坐标关系吧。如图:

P(Xc, Yc, Zc)是相机坐标系中的点,p(x, y)是图像坐标系中的点,f是焦距。

补充: 其实上面的式子没有计算一些偏差。什么偏差呢?我们也许认为主点即等于成像仪的中心,但这意味着某些人拿着镊子和胶水要把摄像机里面的成像仪以及微米级别的精度安装。实际上,芯片中心通常不在光轴上。我们因此引入两个新的参数 cx 和 cy 。对可能的偏移(对光轴而言)进行建模。这样物理世界中的点P, 其坐标一某些便宜的方式投影点为:

至于式子中焦距为何是fx 和 fy 我也不清楚。下面是网上的一种解释。

3.3 世界坐标系与相机坐标系

世界坐标系 Ow-Xw-Yw-Zw 是我们自己建立的,也就是根据我们输入现实空间中点的坐标来确定世界坐标系的。因此这个坐标系并不是固定的,它可以旋转、平移,但是正交的效果肯定是不变的,因此不会发生切变。那我们要得到世界坐标系与相机坐标系之间的关系就要知道旋转和平移的知识了。
学过线性代数的同学可能知道,一个向量乘以一个矩阵可以达到旋转的效果,那么加一个向量可以达到平移的效果

于是,从世界坐标系到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。绕着不同的坐标轴旋转不同的角度,得到相应的旋转矩阵,如下图所示:

那么从世界坐标系到相机坐标系的转换关系如下所示:

那么通过上面四个坐标系的转换就可以得到一个点从世界坐标系如何转换到像素坐标系的。

对于上方的矩阵计算中,我们可能会好奇为什么2D会扩展到3D,且第三维的值为1,这篇博文中有很好的解释齐次方程的通俗解释

四、透镜畸变

理论上讲是可能定义一种透镜而不引入任何畸变的。然而由于制造上的原因,制作一个 " 球形 " 透镜比制作一个数学上理想透镜更容易。而且从机械方面也很难把透镜和成像仪保持平行。这里我们主要描述两种主要的透镜即便并且为它们建模。径向畸变来自于透镜形状因为弯曲的透镜能更好的透过光线),而切向畸变则来自于整个摄像机的组装过程

径向畸变:实际相机的透镜总是在成像仪的边缘产生显著畸变。对于某些透镜中心的地方比靠近中心的地方更加弯曲



径向畸变的矫正公式如下(这里不给出推导过程,直接使用)

式中,(x,y)是理想的无畸变的坐标(图像坐标系),(xdr,ydr)是畸变后图像像素点的坐标,而且,

切向畸变:切向畸变可以这样理解,当透镜与成像平面不平行时,就产生了畸变,类似于透视变换。打个比方的例子。

切向畸变的矫正公式如下(这里不给出推导过程,直接使用)

畸变矫正
因此我们只要求出畸变矩阵,然后进行逆操作就可以消除畸变了。通过上面介绍的径向畸变和切向畸变模型,可以得到两个模型最终作用于真实图像后的矫正模型。

为什么是相加呢,可以这样理解,畸变就是距离的变化,而距离的变化反映到坐标值上就是加减的关系。

五、相机参数标定到底怎么用?

当求解出了相机的内参和外参后,那么如何使用这些参数呢?下面做一个大致的说明。

上面的理论部分是通用的,但是,在实际的应用过程中,却有区别。比如说,在我的项目经验中,有用到单目视觉的情况,也有用到双目视觉的情况。

对于单目视觉而言,实际上我们是没有必要知道世界坐标系的,因为,我们没必要去探究到底我这一个相机处于世界坐标坐标系的什么位置。据我了解,如果采用单目视觉的立体图像匹配,或者空间位置定位,应该需要用到空间位置信息。那么,在通常的单目视觉应用中,求得内参和畸变参数后,就可以对新拍摄的图像做变换和矫正。矫正完拍摄的图像之后,就可以对图像做其他处理了。

对于双目视觉而言,需要用到世界坐标系。对单目视觉做完内参和畸变参数的矫正之后,就可以用这些变换后的图像,同时结合世界坐标系实现定位或者其他用途了。

算法原理:
张正友相机标定算法解读
最详细、最完整的相机标定讲解

补充:我们将会在后续文章中介绍张正友相机标定Opencv实现以及标定流程

计算机视觉:摄像机标定(循序渐进理解到应用)相关推荐

  1. 【计算机视觉】摄像机标定2 原理篇

    转载 摄像机标定 http://blog.csdn.net/tiemaxiaosu/article/details/51728961 一.概述 1.摄像机标定内容 摄像机标定实际上是要求出6个外参数. ...

  2. 计算机视觉(相机标定)-2.1 摄像机标定

    计算机视觉(相机标定)- 2.1 摄像机标定 学习前言 一. 摄像机标定是啥?为什么要进行摄像机标定? 二.求MMM 问题一:求解投影矩阵需要多少对应点? 问题二:怎么算? 二.求MMM中的摄像机的内 ...

  3. 【计算机视觉】 摄像机标定

    摄像机标定 齐次坐标 齐次坐标,将欧氏空间的无穷远点,与投影空间中有实际意义的消失点,建立起映射关系. 把齐次坐标转化为笛卡尔坐标的方法:是前面n-1个坐标分量分别除以最后一个分量即可 一些解释和性质 ...

  4. 基于opencv的摄像机标定

    原理简述: 三维世界中的点的位置与其对应的二维投影,遵从以下公式:   其中,  M表示三维世界中的点:  [R|T]表示欧氏变换,是一个3*4矩阵  A表示相机参数矩阵,存放相机内部参数  P表示M ...

  5. Python计算机视觉——照相机标定

    照相机标定 一.针孔照相机模型 针孔相机 坐标转换 畸变现象 畸变矫正 摄像机旋转平移 `Camera rotation and translation` 二.照相机标定 标定参数线性回归 最小二乘求 ...

  6. MFC+OPENCV摄像机标定

    摄像机的追踪标定 本文是我第一次在csdn上写的博客,有不详之处,望大家见谅,也希望大家多多支持. 废话不多说,直接进入正题.对于摄像机标定,是学习图像处理和机器视觉不可回避的话题,这方面的现有理论已 ...

  7. Python+OpenCV学习(17)---摄像机标定

    Python+OpenCV学习(17)---摄像机标定 原文:http://blog.csdn.net/firemicrocosm/article/details/48594897 利用python学 ...

  8. matlab相机标定_【显微视界】基于视觉伺服的工业机器人系统研究(摄像机标定、手眼标定、目标单目定位)...

    今日光电        有人说,20世纪是电的世纪,21世纪是光的世纪:知光解电,再小的个体都可以被赋能.欢迎来到今日光电! ----与智者为伍 为创新赋能---- 标定技术 常见的机器人视觉伺服中要 ...

  9. scare机器人如何手眼标定_基于视觉伺服的工业机器人系统研究(摄像机标定、手眼标定、目标单目定位)...

    击上方"新机器视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 标定技术 常见的机器人视觉伺服中要实现像素坐标与实际坐标的转换,首先 ...

  10. 张正友摄像机标定的研究(MATLAB+OpenCV)

    张正友 本科浙大,本来以为是中国人论文是中文呢,哎 张正友的主页: http://research.microsoft.com/en-us/um/people/zhang/Calib/ 不过里面的棋盘 ...

最新文章

  1. 云上人第七代产品简单的代码
  2. android simples 结构,android – 如何在simple_list_item_2中构造和显示信息?
  3. 《软件工程》课程设计总结
  4. 数据持久化 plist,CoreData,Sqlite
  5. 为什么D触发器需要建立时间与保持时间
  6. Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇
  7. java类的理解_Java类该怎么理解?
  8. 帆软动态列之数据集实现动态列
  9. 阿里云云计算 23 VPC的基础架构
  10. 英语作文计算机国际会议开幕词,国际学术会议英文主持词
  11. 参加西湖论剑2021
  12. Python中的any函数
  13. 阿里无线11.11 | 手机淘宝主会场实践之路
  14. NRF52832程序烧录失败原因
  15. Windows操作系统的日志分析
  16. Google Map API 使用总结
  17. getInputStream/getReader() has already been called for this request
  18. 校招总结(华为、远景、新美大、百度、腾讯、网易游戏)
  19. 发布我的下棋作品--Monkey黑白棋(AI还可以,战胜了不少其它的黑白棋程序)
  20. iOS开发-全量日志捕获CocoaLumberjack

热门文章

  1. android 启动3d加速,内置显卡 六款支持3D加速安卓手机推荐
  2. 智慧发电厂+智能发电厂web端平台管理系统+Axure高保真智慧电厂系统+能耗管理+告警管理+生产监控+安防设备管理+运维设备管理+监控面板+系统管理+智慧电厂+电厂系统+智慧电厂管理平台+rp原型
  3. 同轴线传输网络摄像机信号2KM
  4. 传销分子为什么喜欢国学? PS:尽信书不如无书!
  5. 一种喷涂有可吸收电磁波的水性油漆的飞机外壳
  6. 大道至简——RISC-V架构之魂(上)
  7. 《保护我们的数字遗产:DNA数据存储》白皮书发布
  8. sparksql java_JAVASparkSQL
  9. 记录kettle spoon.bat 无法启动 (系统找不到指定的路径。) 只有无限接近死亡 才能领悟真滴
  10. QT Creator + qt4.8.6配置报错:无法在环境变量中找到make命令: mingw32-make.exe问题解决