如何通过立体视觉视差图与深度图计算车辆真实距离
基于深度图/视差图计算检测车辆真实距离的实现方案
你已经拿到原始depth_map数组的前提下,不需要额外从视差图做转换,直接基于深度图计算是路径最短、误差最可控的方案,具体实现逻辑如下:
核心计算逻辑
1. 前置校验
首先确认你的depth_map数值尺度:
- 如果是经过标定对齐的立体视觉输出,先确认深度值单位:常见输出单位为毫米,转米的缩放系数为0.001;如果输出是0-1/0-255的归一化值,需要先结合相机参数做尺度映射,否则结果没有物理意义。
- 不要用应用了colormap的伪彩可视化图计算,这类图存储的是RGB通道值,和真实深度值没有线性对应关系,必须用原始的单通道深度数组计算。
如果你只有视差图、没有对齐尺度的深度图,直接用经典双目深度公式计算即可:
Z = (f * B) / d,其中f是双目相机水平焦距(单位:像素,从内参获取),B是双目基线长度(两个光心的间距,单位和最终输出距离单位一致,从外参获取),d是对应像素的视差值。
2. 检测框内有效深度提取
不要直接对整个检测框的深度值求平均,也不要直接取检测框中心点的单像素深度——检测框内通常包含地面、空隙、车窗透明区域、远处背景等无效像素,直接计算误差极大,正确的ROI取法:
- 取检测框中心偏下1/3的横向居中区域:这个位置对应车辆前脸/后备箱的实体车身,是离相机最近的车辆部分,极少混入背景或地面
- 剔除ROI内的无效值:立体匹配输出的空洞点通常数值为0、NaN或者超出相机合理量程的异常值,计算前先过滤
- 对剩余有效深度值取中位数而非均值:中位数对离群点的鲁棒性远高于均值,不会被个别错误匹配的像素带偏结果
3. 可直接复用的实现代码
import numpy as np def calc_vehicle_distance(depth_arr, bbox, scale_to_m=0.001, max_valid_dist=200): """ 从深度数组计算检测车辆的真实距离 参数: depth_arr: 单通道深度数组,尺寸为(H,W),对应你的480×640 depth_map bbox: 检测框坐标,格式为(x_min, y_min, w, h),即边界框左上角x、y坐标+框宽、框高 scale_to_m: 深度值转米的缩放系数,深度单位为毫米时填0.001,单位为米时填1 max_valid_dist: 车载场景有效最大距离阈值,单位米,超过该值的深度判定为无效 返回: 车辆距离(单位:米),无有效深度时返回None """ x_min, y_min, box_w, box_h = bbox x_max = x_min + box_w y_max = y_min + box_h # 截取中心偏下的车身ROI区域 roi_y0 = int(y_min + box_h * 0.6) roi_y1 = int(y_min + box_h * 0.9) roi_x0 = int(x_min + box_w * 0.2) roi_x1 = int(x_min + box_w * 0.8) # 裁剪边界防止数组越界 roi_y0 = max(0, roi_y0) roi_y1 = min(depth_arr.shape[0], roi_y1) roi_x0 = max(0, roi_x0) roi_x1 = min(depth_arr.shape[1], roi_x1) roi_depth_data = depth_arr[roi_y0:roi_y1, roi_x0:roi_x1] # 过滤无效深度值 valid_depth = roi_depth_data[ (roi_depth_data > 0.1) & (~np.isnan(roi_depth_data)) & (roi_depth_data < max_valid_dist / scale_to_m) ] if len(valid_depth) == 0: return None # 取中位数计算距离,保留两位小数 distance = np.median(valid_depth) * scale_to_m return round(distance, 2)
常见误差规避要点
- 如果没有做过相机标定,不知道精确的焦距、基线参数,可以直接用已知距离做尺度校准:把车辆停在距离相机5米的位置,读取上述ROI区域的深度中位数d,缩放系数
scale_to_m = 5 / d即可完成尺度对齐,精度足够常规场景使用 - 远距离场景下(>50米)立体匹配本身的深度误差会快速上升,属于算法固有特性,计算结果仅作参考
- 如果检测框内有效深度占比低于30%,说明该目标区域匹配质量差,建议丢弃该帧的距离结果,不要强行计算
内容的提问来源于stack exchange,提问作者claymorehack
相关产品推荐
相关产品推荐

