相信不少学过图像处理的同学都接触相机标定、图像拼接、单应性、对极几何等计算摄影学内容,体验过学习时被恐惧支配的感觉。本文主要分析相机数学模型,并简单介绍如何使用相机测距,帮助初学者快速入门(其实是我最近看了这个并记下来,哈哈)。
建议入门同学首先阅读homograph文章,了解坐标系变换相关知识。
单应性Homograph估计:从传统算法到深度学习zhuanlan.zhihu.com一、相机数学模型
- 从世界坐标系到相机坐标系
假设在某间房子中放了一台相机拍照。为了方便测量,我们以房子的某处墙角为原心建立直角坐标系,即世界坐标系。为了研究相机模型,要做的第一步就是将世界坐标系转化为以相机光心为原点的相机坐标系,以相机的视角来“看”外部世界。
从世界坐标系
写成齐次坐标矩阵乘法形式:
需要特别注意的是,其中旋转矩阵
为何
用矩阵可以表示为
显然有
- 从相机坐标系到成像平面坐标系
现在已经以相机的视角看外部世界了,接下来要做的就是将外部世界的点投影在成像平面上。假设在光心
这是一个将三维空间中的点
从侧面看上述模型,在光心前方
那么在上图中,由相似三角形原理可以得出:
将上式整理写成齐次坐标矩阵乘法形式:
- 从成像平面坐标系到像素坐标系
对于现在的数字相机,一般使用CMOS或CCD作为传感器将光信号转换为电信号,并记录下来生成数字图像。与传统胶片不同,这类传感器是由一个个感光原件组成的。在工作时每个感光原件独立记录自己所接收到的光信号,导致生成的数字图像是离散的。简单说,数字图像就是一个由离散像素点组成的矩阵。
那么从成像平面坐标系
从
这个变换有两个步骤组成:
- 通过
和将连续坐标量化为像素。其中和分别表示每个像素在和方向的实际大小(单位:米/像素),由相机传感器中每个感光原件大小决定。
- 由于数字图像一般习惯以左上角为原点,那么需要将图像对称中心从
位置平移像素到左上角点。
这样,通过几个步骤相机将世界坐标系
其中
或更简记为:
这里的
当然由于最后一列为0,也记为:
其中
二、视觉测距
- 单目测距(单目距离估计)
那么有一个问题,在已知所有相机参数
这里我们从几何关系上看:只要世界中的点
但是有时候我们又特别需要使用单个摄像头测距:一个典型场景就是在车辆自动驾驶中使用单摄像头识别前方车辆并测距。一般的做法是加入一定的约束条件后单目估计距离。假设相机
其中
- 双目测距
再来看看双目(即两个相机)的测距问题。为了简化问题,假设在同一平面有
特别注意,双目测距要求两个相机坐标轴
那么两个相机分别对远处距离
已知相机坐标系
其中
对于右边的相机:
其中
由于
其中
虽然可以通过双目可以精确测距,但是在实际中也存在问题:
- 双目测距要求
和轴平行,测距精度严重依赖于和的平行程度。
- 为了计算视差
,需要匹配世界中同一点在左右两幅图像中的像素点和,即双目立体匹配。在复杂光照和复杂场景下,如何准确双目立体匹配本身就是很难的问题。
- 对于世界中越远的点
,其在左右视图中的视差越小,测距结果越容易受到双目立体匹配误差影响(即双目测距精度与被测物体距离成反相关)。
所以,单目估计距离简单但是不精确,双目测距精确但是算法复杂且不稳定。
三、深度学习在视觉测距中的发展
当然,目前也有使用深度学习网络单目距离估计的方法:
https://papers.nips.cc/paper/5539-depth-map-prediction-from-a-single-image-using-a-multi-scale-deep-network.pdfpapers.nips.cc第一篇使用深度学习单目网络估计距离的文章发表在NIPS 2014,核心思想就是先得到一个低分辨率的Coarse深度图,再通过网络refine得到高精度距离图。
到了后来,如CVPR 2017这篇加入多级估计距离方法,即每一级
目前CVPR 2020有文章通过边缘和边界来进一步提高深度学习深度估计网络的结果。
综合来说,使用深度学习网络单目距离估计是个是典型的缺乏理论支持的工作,纯粹依赖于大型深度学习网络的拟合能力。目前对于特定的场景(如室内环境,卧室,客厅等),深度学习网络可以进行较为准确的单目距离估计,但是很难推广到任意场景。
为了保住头顶的头发,建议还是别在工程中用了。。。
感谢点赞的小可爱!
对极几何戳这里:
从对极几何恢复相机运动zhuanlan.zhihu.com