You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV视差图disparity=Bf/Z公式量纲单位混淆问题咨询

问题根源:你混淆了公式中参数的单位定义,混用了两套独立的量纲体系

disparity = Bf/Z这个公式本身量纲是完全自洽的,你推导出来的矛盾,来自默认给参数错配了单位:

两套合法的单位使用规则,只要全程统一就不会出错

1. 全物理长度单位体系

这套是纯几何光学推导下的原始形式,所有量都用现实世界长度单位(米/毫米都可,只要统一):

  • 公式里的x、x'不是像素坐标差值,是三维点在左右相机成像传感器平面上的投影点,到各自光轴的物理距离,单位和其他长度量一致
  • B是两相机光心的基线距离,f是镜头的物理焦距(就是镜头参数标称的25mm、50mm那个值),Z是场景点到相机平面的深度,三者单位统一用米或者毫米
  • 这时候算出来的视差x-x'单位也是和其他量一致的长度单位,量纲推导完全成立:[m] = [m] * [m] / [m] = [m],不存在矛盾。

2. 像素单位体系(工程实际最常用)

你在OpenCV里调用立体匹配算法(比如StereoBM、StereoSGBM)输出的视差是像素单位的,这时候不能直接套原始物理公式,要把所有量统一转换到像素单位体系:

  • 先明确传感器的单像素物理尺寸s(单位:米/像素,比如常见的工业相机单像素尺寸3.45μm,就是3.45e-6 m/像素)
  • 把物理焦距f转换成像素等效焦距fx:fx = f / s,这个值的单位是像素,物理意义是镜头焦距对应的传感器长度上,一共能排多少个像素
  • 把物理投影距离转换成像素坐标:像素坐标系下的投影位置x_px = x/s、x'_px = x'/s,对应的像素视差disparity_px = x_px - x'_px = (x-x')/s

把上述转换代入原始物理公式,就能得到像素单位下的视差公式:

原始公式:x - x' = B*f/Z
两边同除s:(x-x')/s = B*(f/s)/Z
替换后得到:disparity_px = B * fx / Z

这时候再做量纲推导就完全自洽:

[pixel] = [m] * [pixel] / [m] = [pixel]

工程落地注意事项

  • 不用自己手动查物理焦距、单像素尺寸算fx,直接用双目相机标定输出的内参矩阵里的fx值就行——标定得到的fx本身就是像素单位,和OpenCV立体匹配输出的像素视差完全匹配
  • 标定的时候用什么长度单位定义棋盘格方格边长,最后算出来的深度Z就是什么单位:比如标定的时候棋盘格边长填25(毫米),那算出来的Z单位就是毫米;如果填0.025(米),Z单位就是米,全程单位统一就不会出量级错误
  • 很多教程写公式的时候会偷懒,直接把像素等效焦距fx简写成f,不特意区分物理焦距和像素焦距,这就是你看到公式觉得量纲矛盾的核心原因

实操避坑:OpenCV的stereoRectify函数输出的Q重投影矩阵,已经提前把fx、基线B、主点偏移这些参数都整合好了,直接调用reprojectImageTo3D输入像素视差图就能输出三维点云,输出的点坐标单位和你标定时用的长度单位一致,不用自己手动套公式计算,出错概率更低。

内容的提问来源于stack exchange,提问作者Caridorc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:12:41