双目视觉之消除畸变

在本篇文章中,将告诉你如何利用相机的标定(camera calibration)来矫正因使用透镜而给针孔模型带来的主要偏差

文章目录

  • 前言:
  • 相机模型
  • 射影几何基础
  • 透镜畸变
  • 标定(计算内参数矩阵和畸变向量)
    • 旋转矩阵和平移向量
    • 单应性
    • 相机标定
      • 求解相机内在参数和畸变参数需要多少个棋盘视图
      • 内幕探秘

前言:

  1. 畸变的产生:
    针孔相机模型:针孔是一堵想象中的墙(中间有一个微型小孔),光线只能从一个针孔中通过,其余的光线被墙所阻隔。但是这样会产生一个问题,针孔不能为快速曝光收集足够的光线,也就是曝光不足,因此这就要引入透镜来得到更多的光线。引入透镜后,使我们背离了针孔模型,更严重的是引入了来自透镜的畸变。
  2. 摄像机标定的重要性:
    摄像机的标定的重要性还在于它是摄像机测量与真实三维世界测量联系的桥梁。摄像机标定的过程既给出了摄像机的几何模型,也给出了透镜的畸变模型,这两个模型定义了摄像机的内参数(intrinsic parameter)。

相机模型

  1. 最简单的针孔模型
    双目视觉之消除畸变_第1张图片
    参数介绍:

    1. f是摄像机的焦距
    2. Z是摄像机到物体的距离
    3. X是物体的长度
    4. x是图像平面上的物体图像

    通过相似三角形可以得到式子如下:
    在这里插入图片描述

  2. 重新把针孔模型整理为另一种等价形式,使数学形式更简单一些,也就是要交换针孔和图像平面
    双目视觉之消除畸变_第2张图片
    点Q=(X,Y,Z)由通过投影中心的光线投影到图像平面上,相应的图像点为q=(z,y,f)。图像平面实际上就是把投影屏幕放置到针孔的前方
    通过相似三角形就可以将负号去掉,得到如下式子:
    在这里插入图片描述

  3. 由于主点不是成像仪的中心,也就是芯片的中心不在光轴上,因此要引入两个新的参数cx和cy。对可能的偏移进行建模。这样物理世界中的点Q,其坐标为(X,Y,Z),以某些偏移的方式投影的点为(xscreen,yscreen),则有式子:
    在这里插入图片描述
    注意:这里引入了两个不同的焦距fx和fy,原因是单个像素点如果只有一个角度成像是正方形而不是长方形

射影几何基础

将物理世界中的坐标为(Xi,Yi,Zi)的一系列物理点Qi映射到投影平面上的坐标为(xi,yi)的点的过程称为“投影变换”。采用这种变换要用到齐次坐标。齐次坐标就是将维数为n的投影空间上的点用(n+1)维向量表示,其额外限制就是任意两个点的值成比例时即为等价点。在这里,图像平面是一个二维投影空间,因此可以用一个三维向量q = (q1,q2,q3)来表示该平面上的点,因此可以将摄像机的参数(fx,fy,cx,cy)重新排列为一个3*3的矩阵,该矩阵称为摄像机的内参数矩阵可以表示为下式:
双目视觉之消除畸变_第3张图片
展开该式,可以发现w = Z,并且点q是齐次坐标形式,除以w(或Z),就可以恢复以前的定义。

透镜畸变

理论上可以顶一个没有引入畸变的透镜,但是现实世界没有完美的透镜。畸变主要有两种:径向畸变和切向畸变

  1. 径向畸变来自于透镜形状
    径向畸变:远离透镜中心的光线比靠近透镜中心的光线弯曲很多,在光学中心的畸变为0,随着向边缘移动,畸变越来越严重。效果图下图:
    双目视觉之消除畸变_第4张图片
    为了消除畸变,要用r = 0位置周围的泰勒级数展开的前几项定量描述,成像仪某点的径向位置按下式进行调节:
    双目视觉之消除畸变_第5张图片
    这里(x,y)是畸变点在成像仪上的原始位置,(Xcorrected,Ycorrected)是矫正后的位置
  2. 切向畸变来自于整个摄像机的组装过程
    双目视觉之消除畸变_第6张图片

标定(计算内参数矩阵和畸变向量)

旋转矩阵和平移向量

对相机拍摄的一个特定物体的图像,我们可以用旋转和平移来描述物体相对于相机坐标系统的姿态。
双目视觉之消除畸变_第7张图片
上图描述的是:从物体到相机坐标系的转换,物体上的点P对应图像平面上的点p,通过使用旋转矩阵R和平移向量t将点p和P关联起来

  1. 旋转
    任何维数的旋转可以描述为坐标向量于合适尺寸的方阵的乘积。最终,旋转等同于在一个新的坐标系统中对点的位置引入一个新的描述。
    在三维空间中,旋转可以分解为绕各自坐标轴的二维旋转,其中旋转轴的度量保持不变。

    1. 绕x轴旋转ω
      双目视觉之消除畸变_第8张图片
    2. 绕y轴旋转φ
      双目视觉之消除畸变_第9张图片
    3. 绕z轴旋转θ
      双目视觉之消除畸变_第10张图片

    总的旋转矩阵R=Rx (ω)∗Ry (φ)∗ Rz (θ)

  2. 平移
    平移向量用来表示怎样将一个坐标系的原点移动到另一个坐标系的原点,或者说,平移向量是第一个坐标系统的原点到第二个坐标系统的原点的偏移量。因此,从以物体中心为原点的坐标系到以相机中心为原点的坐标系,相应的平移向量为T= originobject−origincamera

  3. 小结:
    因此可以得到一个点在物体坐标系中的坐标为PO,对应相机坐标系中的坐标PC=R∗ (PO − T)。
    从上述可以知道用三个角度来表示三维旋转,用三个参数(x,y,z)表示三维平移。因此共有6个参数。对于摄像机本身而言,又有4个参数(fx,fy,cx,cy),因此对每个视场需要求解10个参数,但是每个视场固定8个参数。因为不同视角下旋转和平移的6个参数会变化,对于每一个视角用来求解摄像机内参数矩阵的两个额外参数需要约束。因此求解全部的参数至少需要两个视角。

单应性

在计算机视觉中,平面的单应性被定义为从一个平面到另一个平面的投影映射。因此一个二维平面上的点映射到摄像机成像仪上的映射就是一个单应性的例子。这种映射可以表示为矩阵相乘,表示为下式:
双目视觉之消除畸变_第11张图片
点Q表征的是所有空间的坐标,但是不需要关注所有空间中的点,只需要关注所寻找的平面的坐标Q,因此可以简化,令Z = 0,这样做的原因是如果把旋转矩阵分解为3个3行1列的向量(R =[r1 r2 r3]),那么其中的一个列向量就不需要了。
式子可以化简如下:
在这里插入图片描述
使H为单应性矩阵,则H=s∗M∗[r1 r2 t],其中q=s∗H∗Q,此时H是3*3矩阵。

相机标定

求解相机内在参数和畸变参数需要多少个棋盘视图

假设有N个角点和K个棋盘图像(不同位置)。需要多少视图和角点才能有足够的约束条件来求解所有这些参数?

  1. K个棋盘提供图像2 * N * K个约束(出现因子2是因为图像上的每个点都具有x和y两个坐标值)
  2. 忽略每次的畸变参数,有4个内在参数和6 * k个外在参数(这里的6是因为旋转3个参数、平移3个参数)
  3. 求解的前提是2 * N * K >= 6 * K + 4

这里的角点个数N只能为4(具体原因可以自己百度“透视图像”),所以理论上K的值为2,但是实际上至少需要10个或者更多的视图,这种差异是因为内在参数对非常小的噪声具有非常高的灵敏度。

内幕探秘

双目视觉之消除畸变_第12张图片
参考文献:Adrian Kaehler,Gary Bradski,Learning Opencv3[M],清华大学出版社,2018.7

下面的是笔者的微信公众号,欢迎关注,会持续更新c++、python、tensorflow、机器学习、深度学习、计算机视觉等系列文章,公众号中内含300+本pdf电子书籍,肯定有你需要的一本,关注公众号即可领取哦。
在这里插入图片描述
如果你对JAVA方面感兴趣,可以关注下面JAVAERS公众号,陪你一起学习,一起成长,一起分享JAVA路上的诗和远方。在公众号里面都是JAVA这个世界的朋友,公众号每天会有技术类文章,面经干货,也有进阶架构的电子书籍,如Spring实战、SpringBoot实战、高性能MySQL、深入理解JVM、RabbitMQ实战、Redis设计与实现等等一些高质量书籍,关注公众号即可领取哦。
在这里插入图片描述

你可能感兴趣的:(opencv学习实战)