之前在做车道线识别项目的时候,同事提出来用摄像头测距。大致研究了一下,理论上是无法测距的,因为想用2维信息(像素坐标系)还原3维信息(世界坐标系),不加条件是不可能的,但是如果假设测量的点在地面上,就是用2维信息还原2维信息,还是有得搞。
预备知识:像素坐标系——图像坐标系——相机坐标系——世界坐标系,这4个坐标系的关系:相机的内参矩阵 M 将相机坐标系和像素坐标系联系起来,相机的外参矩阵 W 将世界坐标系和相机坐标系联系起来,(这里注意一点,一般说的相机的内参包括内参矩阵和畸变系数,这里说的是针孔相机模型(pin-hole),所以不考虑畸变系数);相机的外参矩阵其实就是旋转 R 和平移 t ,其中 R 是3x3旋转矩阵,t 是1x3的平移向量。理论上,世界坐标系中一点Q,在内外参矩阵的作用下,可以计算出在像素坐标系中的位置q。可以参考这篇文章,写的比较详细、明白,虽然是左手系。
https://blog.csdn.net/chentravelling/article/details/53558096
上图
如图所示。令世界坐标系的原点和相机坐标系的原点(摄像头的中心)在同一垂线上,这样平移向量t中就有2个0;令世界坐标系和相机坐标系是平行的,因为这样旋转矩阵R 就是单位矩阵I ,(虽然是y轴指向地面有点奇怪,这是因为要照顾像素坐标系u、v的缘故)。采用Learning OpenCV3一书中的记号
这里先忽略s,它只是计算出后面乘积之后提取出来的系数,为了让左边的向量的第三个分量变为1;u,v是像素值;M是相机的内参矩阵;W是3x4的外参矩阵,前三列是旋转矩阵,第四列是平移向量,其中h是相机离地高度;Xw,Yw,Zw是世界坐标系下的坐标。由于假设R=I,t=[0 ,h, 0]的转置,并且Q在地面上,所以Yw=0。接下来就是解这个简单的方程组
Z就是点Q在z轴方向的距离,X是x轴的距离。h和X、Z的单位是一样的,可以是米也可以是毫米。此外,
称为单应性矩阵。
下一步就是写代码,再做个实验验证一下这个简易的算法。