赞
踩
操作系统:ubuntu18.04
显卡:GTX1080ti
python版本:2.7(3.7)
QQ群:加入深度学习交流群 获取学习资料 (147960154)
主要介绍深度相机的成像原理及投影坐标转换
目前主流的深度相机根据其工作原理可分为三类:RGB双目、结构光、TOF
相机类型 | RGB双目 | 结构光 | TOF |
---|---|---|---|
相机代表 | ZED相、Leap Motion、大疆 | Kinect v1、Realsense、奥比中光 | Kinect v2、v3、 realsense L515 |
工作原理 | 被动式: RGB图像特征匹配,三角测量间接计算 | 主动式:主动投射已知编码光源,提升特征匹配效果 | 主动式:根据飞行时间直接测量 |
测量精度 | 短工作范围内能够达到mm级(0.01mm~1cm) | 短工作范围内能够达到高精度(0.01mm-1mm) | 最高可达厘米级 |
测量范围 | 0.1m ~ 20m(距离越远精度越低) | 0.1m ~ 10m(距离越远精度越低) | 0.1m ~ 100m(不受距离的影响) |
环境限制 | 受光照变化和物体纹理影响大、夜晚无法使用 | 室内,暗室效果不错,室外强光效果会产生较大测量误差 | 不受光照变化和物体纹理影响,受反光影响 |
分辨率 | 高,可达2K分辨率 | 高,可达1280x720 | 低(512×424) |
帧率 | 1~ 90 fps | 1~30 fps | 高,可达几百fps |
功耗 | 较低,主要靠软件 | 中,USB即可 | 很高,需要外电源 |
想要了解深度相机的原理之前,先补充一下普通的RGB相机成像原理,了解相机的内参矩阵和外参矩阵,坐标系转换,以及相机拍摄中会产生什么畸变以及畸变的矫正方法。
光心,焦距,像距,物距,光圈,景深
在相机中,焦距即为光心到底片的距离(光学中称为像距),远离镜头的影像就能在底片或传感器上形成清晰的影像,日常中说的“调焦”实际为调整光心与底片的距离,并不会改变凸透镜的焦距
相机成像原理中涉及到4个坐标系的转换,分别是:
维度dimension | 含义 | |
---|---|---|
世界坐标系(world coordinate) | 3D (U,V,W) | 世界坐标系通常以所感兴趣的物体object为中心建立 |
相机坐标系(camera coordinate) | 3D (X,Y,Z) | 相机坐标系由成像平面,焦距,光心点唯一确定;Z轴为光轴 |
成像坐标系(film coordinate) | 2D (x,y) | 成像坐标系由相机的成像平面唯一确定,XY轴与相机坐标轴平行 |
像素坐标系(pixel coordinate) | 2D (u,v) | 进行图像处理算法时用到的图像所在的2D像素坐标系 |
在将世界坐标系中的3D真实点转换到通常进行图像处理时所使用的以像素为单位的2D图像上,通常的前向投影过程如下:
Step 1 : 世界坐标系到相机坐标系 (相机外参R
和T
)
一般世界坐标系和相机坐标系都是描述的同一空间维度,因而此处等价于坐标系变换。我们使用相机外参矩阵时,主要是用来对应多个摄像头的坐标系统一问题。以STB数据集为例,深度相机坐标系即为世界坐标系,RGB相机的坐标系则需经过相机外参矩阵变换,以转化并统一到深度相机坐标系。
# External camera parameters
R = np.array([0.00531,-0.01196,0.00301])
T = np.array([-24.0381, -0.4563, -1.2326])
rotationMatrix = cv2.Rodrigues(R)[0]
T = np.reshape(T,[3,1])
kp_coord_xyz_rgb = np.dot(np.transpose(rotationMatrix), kp_coord_xyz - T)
Step2:相机坐标系到成像坐标系 (相机内参f)
通过相机内参f:相机的焦距(成像平面到光心的距离,在相机主轴上计算)参数,将相机坐标系中的点转换到成像坐标系上
从相机坐标系3D到成像坐标系2D,使用的是透视变换 (利用相似三角形原理),注意图中给出的成像平面本身应该在光心O左边的f位置处(才是正确的小孔成像原理),但是这里为了简便就直接对称过来了。
Step3 : 成像坐标系到像素坐标系 (相机内参Ox,Oy,Sx,Sy)
通过相机内参Ox,Oy(平移,从成像坐标系的中心点平移到像素坐标系的中心点上)和Sx、Sy(对于成像平面/感光器件成像后的图像进行的采样,表示x和y轴方向上的采样率),将成像坐标系转换到图像像素坐标系上。
在深度相机中一般将Step2
和Step3
整合到一起,即为相机的内参矩阵,投影变换和仿射变换。
#for rgb image
fx = 607.92271
fy = 607.88192
tx = 314.78337
ty = 236.42484
K = np.array([[fx,0,tx],
[0,fy,ty],
[0,0,1]])
kp_coord_uv_rgb = np.dot(K, np.dot(np.transpose(rotationMatrix), kp_coord_xyz - T))
STB数据集显示的效果图如下
即通过图像中的人手关节点还原到世界坐标系中
和小孔成像不同在于,为了拍摄很大的范围,收集更多的光源,相机采用的镜头都是凸透镜。相机视场角比较小(比如手机摄像头)时,一般可以近似为针孔相机成像,三维世界中的直线成像也是直线。 但是很多时候需要用到广角甚至鱼眼相机,此时会产生畸变,三维世界中的直线在图像里会弯曲。基于针孔模型下坐标变换的假设就不成立了。因此需要引入相机畸变参数,对图像进行去畸变处理。
畸变类型:
相机透镜的畸变主要分为径向畸变和切向畸变,还有其他的畸变,但都没有径向和切向畸变影响显著,所以我们在这里只考虑径向和切向畸变
畸变矫正方法
相机视场角比较小(比如手机摄像头)时,一般可以近似为针孔相机成像,三维世界中的直线成像也是直线。 但是很多时候需要用到广角甚至鱼眼相机,此时会产生畸变,三维世界中的直线在图像里会弯曲。因此,需要做去畸变。
1、首先需要对双目相机进行标定,得到两个相机的内外参数、单应矩阵。
2、根据标定结果对原始图像校正,校正后的两张图像位于同一平面且互相平行。
3、对校正后的两张图像进行像素点匹配。
4、根据匹配结果计算每个像素的深度,从而获得深度图。
理想双目相机成像模型
假设左右两个相机位于同一平面(光轴平行),且相机参数(如焦距f)一致。那么深度值的推导原理和公式如下。
分析: 三点确定一个平面,假设平面M由(L, R, P)三点确定,camera L摄像头可以确定P点在平面M中的LP直线上,且可由相机内参计算出LP的直线方程,同理camera R则可以确定RP直线方程,由于LP和RP处于同一平面且不平行,则必然相交于唯一的点P,故P点坐标即可求得。
根据上述推导,空间点P离相机的距离(深度)z=f*b/d,可以发现如果要计算深度z,必须要知道:
1、相机焦距f,左右相机基线b。这些参数可以通过先验信息或者相机标定得到。
2、视差d。需要知道左相机的每个像素点(xl, yl)和右相机中对应点(xr, yr)的对应关系。这是双目视觉的核心问题。
极线约束
对于左图中的一个像素点,如何确定该点在右图中的位置?是不是需要我们在整个图像中地毯式搜索一个个匹配?
答案是:不需要。因为有极线约束。极线约束对于求解图像对中像素点的对应关系非常重要。
上文提到的M平面称为极平面,所谓极线约束(Epipolar Constraint)就是指当同一个空间点在两幅图像上分别成像时,已知左图投影点p1,那么对应右图投影点p2一定在相对于p1的极线上,这样可以极大的缩小匹配范围。
图像矫正
上文提及的都是理想情况下,两个相机的坐标系的xyz三轴平行,而实际应用中,往往是不平行的,因此需要图像矫正技术
图像矫正技术:分别对两张图片用单应(homography)矩阵变换(可以通过标定获得)得到的,的目的就是把两个不同方向的图像平面(下图中灰色平面)重新投影到同一个平面且光轴互相平行(下图中黄色平面),这样就可以用前面理想情况下的模型了,两个相机的极线也变成水平的了。
1、优点
1)、对相机硬件要求低,成本也低。因为不需要像TOF和结构光那样使用特殊的发射器和接收器,使用普通的消费级 RGB相机即可。
2)、室内外都适用。由于直接根据环境光采集图像,所以在室内、室外都能使用。相比之下,TOF和结构光基本只能 在室内使用。
2、缺点
1)、对环境光照非常敏感。双目立体视觉法依赖环境中的自然光线采集图像,而由于光照角度变化、光照强度变化等 环境因素的影响,拍摄的两张图片亮度差别会比较大,这会对匹配算法提出很大的挑战。
2)、不适用于单调缺乏纹理的场景。由于双目立体视觉法根据视觉特征进行图像匹配,所以对于缺乏视觉特征的场景 (如天空、白墙、沙漠等)会出现匹配困难,导致匹配误差较大甚至匹配失败。
3)、相机基线限制了测量范围。测量范围和基线(两个摄像头间距)关系很大:基线越大,测量范围越远;基线越 小,测量范围越近。所以基线在一定程度上限制了该深度相机的测量范围。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。