教程地址 https://zhuanlan.zhihu.com/p/135943895
相信不少学过图像处理的同学都接触相机标定、图像拼接、单应性、对极几何等计算摄影学内容,体验过学习时被恐惧支配的感觉。本文主要分析相机数学模型,并简单介绍如何使用相机测距,帮助初学者快速入门
假设在某间房子中放了一台相机拍照。为了方便测量,我们以房子的某处墙角为原心建立直角坐标系,即世界坐标系。为了研究相机模型,要做的第一步就是将世界坐标系转化为以相机光心为原点的相机坐标系,以相机的视角来“看”外部世界。
从世界坐标系 到以相机光心为坐标原点的 的相机坐标系,实际上就是一个三维直角坐标系的旋转与平移变换,可以表示为:
写成齐次坐标矩阵乘法形式:
需要特别注意的是,其中旋转矩阵 是正交矩阵(即 , 是单位矩阵),这是一个非常重要的性质。
为何 是正交矩阵?这里从简单的情形说起。如下图将坐标系绕 轴旋转 角,用矩阵可以表示为:
用矩阵可以表示为
显然有 成立。更复杂情况类似,感兴趣的朋友可以自行探索。
现在已经以相机的视角看外部世界了,接下来要做的就是将外部世界的点投影在成像平面上。假设在光心 后距离 处有一个接收并记录光信号的传感器,那么传感器所在的平面就是成像平面。这里的 就是相机的物理焦距(单位:米)。
这是一个将三维空间中的点 通过光心 投影到成像平面的过程,并在成像平面形成倒像。这里有一个问题,为何平时我们用手机、数码相机拍照时生成的图片不是倒的?这是由于手机、数码相机等拍照设备内部软件在处理时做了自动翻转。
从侧面看上述模型,在光心前方 位置存在一个与成像平面对称的等效成像平面(等效成像平面中的像与成像平面的像大小一样且相反)。
由于成像平面中的像是倒像(需要添加负号,不方便数学描述),我们不妨在等效成像平面看,并建立坐标系 。
那么在上图中,由相似三角形原理可以得出:
将上式整理写成齐次坐标矩阵乘法形式:
对于现在的数字相机,一般使用CMOS或CCD作为传感器将光信号转换为电信号,并记录下来生成数字图像。与传统胶片不同,这类传感器是由一个个感光原件组成的。在工作时每个感光原件独立记录自己所接收到的光信号,导致生成的数字图像是离散的。简单说,数字图像就是一个由离散像素点组成的矩阵。
那么从成像平面坐标系 到像素坐标系 就是一个离散化的过程。之前所有坐标系(包括世界坐标系 、相机坐标系 、成像平面坐标系 )的单位都是连续的“米”,而 像素坐标系的单位是离散的“像素”。
从 到 的变换可以表示为:
这个变换有两个步骤组成:
这样,通过几个步骤相机将世界坐标系 中的点(单位:米)最终变换为像素坐标系 中的点(单位:像素)。那么最终变换关系是:
13个位置参数 13组匹配点 计算出来
其中 是相机物理焦距(单位:米), 和 表示每个像素在 和 方向的实际大小(单位:米/像素), 和 表示图像对称中心在 像素坐标系中的的位置(单位:像素)。简记为:
或更简记为:
这里的 是相机内参矩阵,由相机内部光学物理结构决定。
其中 , 。
而 和 是相机外参矩阵,由相机摆放位置决定。
显然相机标定就是计算内、外参矩阵的过程。
那么有一个问题,在已知所有相机参数 、 和 的情况下,能否通过图像坐标 反推出对应的世界坐标 呢?
这里我们从几何关系上看:只要世界中的点 在 射线上,那么最终都会通过相机投影到图像中的 点,所以单摄像头无法精确测距。相机模型本质是一种从世界坐标系3D->像素坐标系2D的投影变换,在投影变换中丢失了深度 信息。
但是有时候我们又特别需要使用单个摄像头测距:一个典型场景就是在车辆自动驾驶中使用单摄像头识别前方车辆并测距。一般的做法是加入一定的约束条件后单目估计距离。假设相机 轴与水平地面平行,到地面高度为 ,且被测物体在地面上(加入的约束条件);在相机下方 距离有一个标定板,上面画的是与 轴水平距离的刻度。在测距前首先拍摄一张标定板图像;当测距时可以根据地面上的物体在图像中的位置读取 ,此时可以估计出地面物体与相机真实距离为:
其中 和 已知,而 可以从标定板图像中读取出来。需要说明,这只是一种估计方法,并非精确计算。
再来看看双目(即两个相机)的测距问题。为了简化问题,假设在同一平面有 和 两个完全一样的相机,他们的相机坐标系 与 轴在同一直线上且 平行于 。显然可以通过测量获得两个相机间的距离 ,然后通过标定可以知道相机 、 、 和 参数。
特别注意,双目测距要求两个相机坐标轴 和 平行,否则就是对极几何问题了。
双目测距
那么两个相机分别对远处距离 处同一目标拍照得到左、右张两张图像。由于视角不同,同一点在两张图像像素位置不同,即存在视差 。
已知相机坐标系 变换为像素坐标系 的公式为:
其中 , 。那么从上式得出,对于左边的相机:
对于右边的相机:
其中 。上面两式相减得:
由于 ,那么有:
其中 可以通过相机标定获得, 可以测量获得, 可以通过左、右张两张图像计算视差获得,则 能够精确计算出来。
虽然可以通过双目可以精确测距,但是在实际中也存在问题:
所以,单目估计距离简单但是不精确,双目测距精确但是算法复杂且不稳定。
原文:https://www.cnblogs.com/kekeoutlook/p/13179468.html