【机器人-深度估计】双目深度估计原理解析
文章目录
- 一、基本原理
- 二、主要处理流程
- 2.1. 匹配代价(Matching Cost)
- (1)常见匹配代价函数
- 1. 绝对差(SAD,Sum of Absolute Differences)
- 2. 平方差(SSD,Sum of Squared Differences)
- 3. 归一化互相关(NCC,Normalized Cross-Correlation)
- 4. Census 变换
- (2)匹配代价函数对比
- 2.2. 代价体(Cost Volume)
- 2.3. 代价聚合(Cost Aggregation)
- 2.4. 视差计算(Disparity Computation)
- 2.5. 视差优化(Disparity Refinement)
- 2.6. 深度恢复(Depth Recovery)
一、基本原理
两个相机拍摄同一场景,形成左图 I L I_L IL 和右图 I R I_R IR,若场景中某点 P P P 在左图和右图的投影点分别为 p L p_L pL 和 p R p_R pR,它们之间的水平距离就是视差 d d d。
视差计算公式:
d = x L − x R d = x_L - x_R d=xL−xR
深度恢复公式:
Z = f ⋅ B d Z = \frac{f \cdot B}{d} Z=df⋅B
其中:
- Z Z Z:深度值
- f f f:相机焦距
- B B B:双目基线长度(相机间距)
- d d d:视差
二、主要处理流程
2.1. 匹配代价(Matching Cost)
(1)常见匹配代价函数
1. 绝对差(SAD,Sum of Absolute Differences)
最简单直接的度量方式,对亮度差进行绝对值计算:
C SAD ( x , y , d ) = ∣ I L ( x , y ) − I R ( x − d , y ) ∣ C_{\text{SAD}}(x, y, d) = |I_L(x, y) - I_R(x - d, y)| CSAD(x,y,d)=∣IL(x,y)−IR(x−d,y)∣
窗口版本:
C SAD ( x , y , d ) = ∑ ( u , v ) ∈ W ∣ I L ( x + u , y + v ) − I R ( x − d + u , y + v ) ∣ C_{\text{SAD}}(x, y, d) = \sum_{(u,v) \in \mathcal{W}} |I_L(x+u, y+v) - I_R(x - d + u, y + v)| CSAD(x,y,d)=(u,v)∈W∑∣IL(x+u,y+v)−IR(x−d+u,y+v)∣
优点: 快速、简单
缺点: 对光照变化敏感,窗口大小固定易模糊边界
2. 平方差(SSD,Sum of Squared Differences)
对亮度差平方,加大离群像素的惩罚:
C SSD ( x , y , d ) = ( I L ( x , y ) − I R ( x − d , y ) ) 2 C_{\text{SSD}}(x, y, d) = (I_L(x, y) - I_R(x - d, y))^2 CSSD(x,y,d)=(IL(x,y)−IR(x−d,y))2
窗口版本:
C SSD ( x , y , d ) = ∑ ( u , v ) ∈ W ( I L ( x + u , y + v ) − I R ( x − d + u , y + v ) ) 2 C_{\text{SSD}}(x, y, d) = \sum_{(u,v) \in \mathcal{W}} (I_L(x+u, y+v) - I_R(x - d + u, y + v))^2 CSSD(x,y,d)=(u,v)∈W∑(IL(x+u,y+v)−IR(x−d+u,y+v))2
优点: 更平滑,惩罚大误差
缺点: 对噪声更敏感,不鲁棒
3. 归一化互相关(NCC,Normalized Cross-Correlation)
考虑局部均值和标准差,抑制光照变化:
C NCC ( x , y , d ) = ∑ ( u , v ) ∈ W ( I L ( u , v ) − μ L ) ( I R ( u − d , v ) − μ R ) σ L ⋅ σ R C_{\text{NCC}}(x, y, d) = \frac{\sum_{(u,v) \in \mathcal{W}} (I_L(u,v) - \mu_L)(I_R(u - d,v) - \mu_R)}{\sigma_L \cdot \sigma_R} CNCC(x,y,d)=σL⋅σR∑(u,v)∈W(IL(u,v)−μL)(IR(u−d,v)−μR)
其中:
- μ L , μ R \mu_L, \mu_R μL,μR 是窗口内左/右图的均值
- σ L , σ R \sigma_L, \sigma_R σL,σR 是窗口内的标准差
优点: 对亮度变化鲁棒
缺点: 计算复杂,适合浮点图像
4. Census 变换
将图像转换为局部结构描述符,再计算汉明距离(Hamming distance):
-
对每个像素构造一个比中心像素大的/小的位图(binary pattern):
Census ( x , y ) = ⋃ ( u , v ) ∈ W [ I ( x + u , y + v ) < I ( x , y ) ] \text{Census}(x,y) = \bigcup_{(u,v) \in \mathcal{W}} [I(x+u, y+v) < I(x, y)] Census(x,y)=(u,v)∈W⋃[I(x+u,y+v)<I(x,y)]
-
匹配代价为二进制描述符间的汉明距离:
C Census ( x , y , d ) = Hamming ( C L ( x , y ) , C R ( x − d , y ) ) C_{\text{Census}}(x, y, d) = \text{Hamming}(C_L(x,y), C_R(x-d,y)) CCensus(x,y,d)=Hamming(CL(x,y),CR(x−d,y))
优点: 对光照变化极强的鲁棒性
缺点: 描述符计算稍复杂,且损失精度信息
(2)匹配代价函数对比
场景 | 建议代价函数 |
---|---|
计算资源少 | SAD / SSD |
光照变化明显(室外) | Census / Rank |
浮点图像 + 精度要求高 | NCC |
深度学习方法 | 使用特征卷积构造代价体 |
2.2. 代价体(Cost Volume)
代价体用于存储每个像素在不同视差假设下的匹配代价。
假设最大视差为 D D D,对于左图中每个像素 ( x , y ) (x, y) (x,y),构建一个代价向量:
C ( x , y , d ) , d ∈ [ 0 , D ] C(x, y, d), \quad d \in [0, D] C(x,y,d),d∈[0,D]
每个 C ( x , y , d ) C(x, y, d) C(x,y,d) 表示左图 ( x , y ) (x, y) (x,y) 与右图 ( x − d , y ) (x - d, y) (x−d,y) 的匹配代价。
2.3. 代价聚合(Cost Aggregation)
从像素级匹配代价到稠密视差图的关键处理步骤,其核心目标是通过整合局部邻域或全局上下文的信息,抑制噪声并增强匹配的准确性。
常见方法:
- 窗口聚合(Box Filter):简单快速,但容易在物体边界模糊
- 引导滤波(Guided Filter):保边性强
- Cross-Based Cost Aggregation:自适应支持区域,提高边界处理能力
2.4. 视差计算(Disparity Computation)
最常见的是WTA策略(Winner Takes All),对每个像素选择代价最小的视差:
d ( x , y ) = arg min d C ( x , y , d ) d(x, y) = \arg\min_d C(x, y, d) d(x,y)=argdminC(x,y,d)
2.5. 视差优化(Disparity Refinement)
包括:
-
左右一致性检测(Left-Right Consistency Check):
- 计算左图→右图 和 右图→左图 的视差,剔除不一致点
-
空洞填补(Hole Filling)
-
亚像素插值(Subpixel Enhancement)
-
中值滤波、双边滤波等图像处理技术提升平滑性和边界精度
2.6. 深度恢复(Depth Recovery)
根据视差和相机参数,使用公式:
Z ( x , y ) = f ⋅ B d ( x , y ) Z(x, y) = \frac{f \cdot B}{d(x, y)} Z(x,y)=d(x,y)f⋅B
即可还原每个像素的深度值。