双目深度估计——视差到深度的两种推导方法

双目深度估计——视差到深度的两种推导方法

0. 基本假设

假设双目系统是标准形式,即:

  • 两相机内参数相同,即焦距、分辨率等参数一致;
  • 两相机光轴平行;
  • 成像平面处于同一水平线;

假设以左相机坐标系为主坐标系,也就是说两相机只存在X轴方向上的平移变换

1. 几何法(直观)

Stereodis2depth

设上面的所有长度的单位为m

  • 由上图标准双目立体系统俯视图所示, O L O_{L} OL O R O_{R} OR分别为左右相机光心, b b b为两相机基线长度, P P P为空间中的一点, P L P_{L} PL P R P_{R} PR分别为 P P P在左右相机成像平面上的像点, f f f为相机的焦距。
  • △ O L A P ∼ △ O L C P L \bigtriangleup O_{L}AP \sim \bigtriangleup O_{L}CP_{L} OLAPOLCPL △ O R B P ∼ △ O R D P R \bigtriangleup O_{R}BP \sim \bigtriangleup O_{R}DP_{R} ORBPORDPR可得:
    • Z f = P A x L − x C = P B x D − x R = P A + P B x L − x R + ( x D − x C ) = b d + ( x D − x C ) \frac{Z}{f}=\frac{PA}{x_{L}-x_{C}}=\frac{PB}{x_{D}-x_{R}}=\frac{PA+PB}{x_{L}-x_{R}+(x_{D}-x_{C})}=\frac{b}{d+(x_{D}-x_{C})} fZ=xLxCPA=xDxRPB=xLxR+(xDxC)PA+PB=d+(xDxC)b进而得到:
    • Z = b f d + ( x D − x C ) Z=\frac{bf}{d+(x_{D}-x_{C})} Z=d+(xDxC)bf,由于两相机参数相等,因此 x D − x C = 0 x_{D}-x_{C}=0 xDxC=0,故而有:
    • Z = b f d Z=\frac{bf}{d} Z=dbf

其中 d = x L − x R d=x_{L}-x_{R} d=xLxR为对应点的视差值

2. 相机参数推导法

由基本假设可以可知,左右相机内参相等,且左右相机只存在X轴方向的平移运动。那么有:

  • 相机内参数: K L = K R = K = [ f x γ u 0 0 f y v 0 0 0 1 ] K_{L}=K_{R}=K=\begin{bmatrix} f_{x}&\gamma&u_{0}\\0&f_{y}&v_{0}\\0&0&1\end{bmatrix} KL=KR=K= fx00γfy0u0v01
  • 相机外参数(以右相机到左相机为例): R R − > L = E R_{R->L}=E RR>L=E t R − > L = [ t x t y t z ] = [ b 0 0 ] t_{R->L}=\begin{bmatrix} t_{x}\\t_{y}\\t_{z}\end{bmatrix}=\begin{bmatrix} b\\0\\0\end{bmatrix} tR>L= txtytz = b00
  • 设: P O L P_{OL} POL P O R P_{OR} POR P L P_{L} PL P R P_{R} PR的坐标分别为 P O L = [ X L Y L Z L ] P_{OL}=\begin{bmatrix} X_{L}\\Y_{L}\\Z_{L}\end{bmatrix} POL= XLYLZL P O R = [ X R Y R Z R ] P_{OR}=\begin{bmatrix} X_{R}\\Y_{R}\\Z_{R}\end{bmatrix} POR= XRYRZR P L = [ u L v L 1 ] P_{L}=\begin{bmatrix} u_{L}\\v_{L}\\1\end{bmatrix} PL= uLvL1 P R = [ u R v R 1 ] P_{R}=\begin{bmatrix} u_{R}\\v_{R}\\1\end{bmatrix} PR= uRvR1

P O L , P O R P_{OL},P_{OR} POL,POR为左右相机坐标系下的P点坐标, P L P_{L} PL P R P_{R} PR为像素坐标,相机内外参详解请参考相机模型

根据小孔成像模型,有:

  • P L = [ u L v L 1 ] = K L 1 Z L P O L = K L 1 Z L [ X L Y L Z L ] P_{L}=\begin{bmatrix} u_{L}\\v_{L}\\1\end{bmatrix}=K_{L}\frac{1}{Z_{L}}P_{OL}=K_{L}\frac{1}{Z_{L}}\begin{bmatrix} X_{L}\\Y_{L}\\Z_{L}\end{bmatrix} PL= uLvL1 =KLZL1POL=KLZL1 XLYLZL

  • P R = [ u R v R 1 ] = K R 1 Z R P O R = K R 1 Z R [ X R Y R Z R ] P_{R}=\begin{bmatrix} u_{R}\\v_{R}\\1\end{bmatrix}=K_{R}\frac{1}{Z_{R}}P_{OR}=K_{R}\frac{1}{Z_{R}}\begin{bmatrix} X_{R}\\Y_{R}\\Z_{R}\end{bmatrix} PR= uRvR1 =KRZR1POR=KRZR1 XRYRZR

  • P O L = R R − > L P O R + t R − > L = E P O R + t R − > L = P O R + [ b 0 0 ] P_{OL}=R_{R->L}P_{OR}+t_{R->L}=EP_{OR}+t_{R->L}=P_{OR}+\begin{bmatrix} b\\0\\0\end{bmatrix} POL=RR>LPOR+tR>L=EPOR+tR>L=POR+ b00

联立上面三个等式可以得到:

  • P L − P R = [ u L − u R v L − v R 0 ] = K 1 Z [ b 0 0 ] P_{L}-P_{R}=\begin{bmatrix} u_{L}-u_{R}\\v_{L}-v_{R}\\0\end{bmatrix}=K\frac{1}{Z}\begin{bmatrix} b\\0\\0\end{bmatrix} PLPR= uLuRvLvR0 =KZ1 b00

由左右相机成像平面在同一水平线上,那么v坐标相等,即 v L − v R = 0 v_{L}-v_{R}=0 vLvR=0

左右相机内参相等,都为 K = [ f x γ u 0 0 f y v 0 0 0 1 ] K=\begin{bmatrix} f_{x}&\gamma&u_{0}\\0&f_{y}&v_{0}\\0&0&1\end{bmatrix} K= fx00γfy0u0v01

Z L = Z R = Z Z_{L}=Z_{R}=Z ZL=ZR=Z

展开得:

  • [ u L − u R 0 0 ] = [ f x γ u 0 0 f y v 0 0 0 1 ] 1 Z [ b 0 0 ] = [ b f x Z 0 0 ] \begin{bmatrix} u_{L}-u_{R}\\0\\0\end{bmatrix}=\begin{bmatrix} f_{x}&\gamma&u_{0}\\0&f_{y}&v_{0}\\0&0&1\end{bmatrix}\frac{1}{Z}\begin{bmatrix} b\\0\\0\end{bmatrix}=\begin{bmatrix} \frac{bf_{x}}{Z}\\0\\0\end{bmatrix} uLuR00 = fx00γfy0u0v01 Z1 b00 = Zbfx00
  • d = u L − u R d=u_{L}-u_{R} d=uLuR,有:
  • Z = b f x d Z=\frac{bf_{x}}{d} Z=dbfx

注意,这里的单位并不一致,视差 d d d的单位是像素,基线 b b b的单位为m, f x f_{x} fx的单位为像素,请参考相机模型

3. 总结

几何法推导更加直观,可以帮助我们快速理解双目获取深度的原理;

相机参数推导法可以进一步加深我们对相机参数的理解,进一理解深度获取的本质问题。

### 双目摄像头二维到三维点云重建原理与实现 #### 一、双目视觉基本原理 双目视觉系统的测距基于三角测量法,通过计算两幅图像中的对应点之间的视差估计深度信息。具体而言,在理想条件下,假设已知左相机和右相机的相对位置以及焦距参数,则可以通过几何关系推导出空间点的距离公式[^2]。 然而,在实际应用中,由于制造误差或其他因素的影响,两个相机不可能完美地保持平行和平面对齐的状态。因此,为了获得精确的结果,通常需要执行一系列预处理操作,包括但不限于标定过程以获取准确的内参矩阵(如焦距f, 主点坐标cx,cy等)、外参矩阵(描述左右相机之间位姿变换的关系),并完成必要的校正工作——即消除镜头产生的径向切向失真效应及调整使得最终得到的一对重投影后的图片尽可能接近理论上的标准配置状态下的样子[^1]。 #### 二、立体匹配算法概述 一旦完成了上述准备工作之后,下一步的关键就在于寻找每一对同名像点的位置差异量d(称为水平方向上视差disparity),这一步骤被称为立体匹配(stereo matching)。它涉及到模式识别领域内的诸多技术手段,比如局部窗口比较方法(Block Matching Algorithm)或者全局能量优化框架(Global Optimization Frameworks)[^3]。 以下是几种常见的立体匹配策略: - **基于区域的方法**:利用小邻域内的灰度一致性来进行相似性衡量; - **基于特征的方法**:提取显著性的角点/边缘作为候选匹配对象; - **动态规划(DP)** 和 半全局匹配(SGM): 这些属于更高级别的解决方案,能够在一定程度上平衡效率与质量间的矛盾。 #### 三、从视差图生成深度图 当成功构建起完整的视差场后,就可以依据简单的数学比例关系把它们转化为对应的物理世界里的距离数值集合,形成所谓的“深度图”。该阶段涉及的主要方程如下所示: \[ Z = \frac{B * f}{d} \] 其中 \(Z\) 表示待求解的目标物离传感器的实际直线距离\(m\); \(B\) 是基线长度(m),也就是两台摄像装置光心连线的欧氏间距; \(f\) 则代表有效焦距(px); 而最后那个变量\(d\) 正是我们之前提到过的像素级偏移量(px). ```python def calculate_depth(disparity_map, baseline, focal_length): depth_map = np.zeros_like(disparity_map).astype(float) valid_mask = disparity_map != 0 depth_map[valid_mask] = (baseline * focal_length) / disparity_map[valid_mask] return depth_map ``` #### 四、由深度数据创建点云模型 有了前面所讨论的内容支持以后,现在我们可以进一步探讨怎样把这些抽象出来的量化指标映射回原始场景当中去。每一个独立采样单元都应当具备自己独一无二的空间定位属性(x,y,z),这样才能构成真正意义上的三维结构表示形式。下面给出了一段伪代码片段用于演示这一转化逻辑的过程: ```python import numpy as np def create_point_cloud(depth_image, camera_matrix): fx, fy, cx, cy = camera_matrix[0][0], camera_matrix[1][1], camera_matrix[0][2], camera_matrix[1][2] rows, cols = depth_image.shape[:2] c, r = np.meshgrid(np.arange(cols), np.arange(rows)) points_z = depth_image.astype(float) points_x = ((c - cx) * points_z) / fx points_y = ((r - cy) * points_z) / fy point_cloud = np.dstack((points_x, points_y, points_z)).reshape(-1, 3) return point_cloud ``` --- ###
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值