OpenCV深度图的准确性

12
我想使用一款3D立体相机手机和OpenCV来测量物体的距离。我正在寻找一种公式,该公式可以根据焦距、两个摄像头之间的距离、图像分辨率和测量对象的大小来衡量距离测量的精度。
经过一些搜索,我找到了以下公式:
d = Z^2 * p / (f*b)
其中Z是物体距离,p是视差准确度,f是焦距,b是基线(摄像头之间的距离)。
我知道基线和焦距,但不知道视差准确度。这个公式适用于我的问题吗?如果是,我如何找到视差准确度?
谢谢。
2个回答

13

我知道这已经晚了一年,但以防有人找到这个。

公式如下:

dD = dd * D^2 / fB

其中:

  • dd = 差错误差
  • dD = 深度误差
  • D = 深度
  • f = 焦距
  • B = 基线

如果f = 6mm = 0.006mB = 24mm = 0.024mD = 10mdd是1像素[暂时称其为P,但通常约为1.4um]。

将所有数字代入得到:

dD = P * 10^2 / (0.006 * 0.024) ~ 694444 P

对于P=1.4um,dD = 0.97 m(大约为9.7%)。

现在,这假设你的对应关系只会产生单个像素误差。您可以进行亚像素搜索,并根据图像中的噪声水平和纹理获得亚像素精确的对应关系。在这种情况下,您的精度将稍微更好。

请注意,此公式适用于误差。视差和深度之间的映射如下:

d = fB / D

其中:

  • d = 视差
  • D = 深度
  • f = 焦距
  • B = 基线

同样地,将数字代入得到:

d = (0.006 * 0.024 / 10) m = 0.0000144 m = 0.0144 mm = 14.4 um

如果您假设您的像素大小约为1.4um,那么14.4um大约是10个像素。这与上面的误差一致--这意味着1个像素的误差大约代表了10%。
一辆距离为10米的汽车在左右传感器之间移动了10个像素。
希望这可以帮到您。

嗨@thang,我的问题是关于差异误差。它是作为典型值使用还是根据传感器参数的给定知识计算? - Mahdi Chamseddine

5
如果您看一下在您提供的文档中公式8后面的段落,您会发现他们的视差精度为0.18 * 10^-6m。继续阅读,我得出结论,他们使用的视差精度是摄像机CCD上两个像素之间的距离(单位:米)。对于一个1/4英寸CCD(测量为3.2毫米乘以2.4毫米)和分辨率为640X480(非常老的VGA相机),这将是5* 10 ^ -6。我不知道LG Optimus 3D的传感器尺寸是多少,但假设采用1/4英寸CCD和2592像素水平分辨率,视差精度的基线为:1.23 * 10^-6,使得10米时的深度精度约为0.85米。在我的看来,这看起来是合理的。如果CCD更小,结果就会更好(即精度值降低)。

这是假定两个立体图像之间的特征完全匹配的最低可能值。该值仅代表您的立体对的物理限制。


谢谢。我正在尝试获取该值的大致估计,以确定我的项目是否可行。我目前瞄准的手机是LG Optimus 3D。它的焦距为6毫米,基线为24毫米。我想计算在10米处的距离测量误差。即使我假设视差误差仅为1个像素,这也没有意义(或者有吗?) d = 10000 ^ 2 * 1 /(24 * 6)=约694米... 我做错了什么? - barisdad
好的,我的第一个错误是这不是以米为单位的。但我仍然不明白它的意思。 - barisdad
...我的第二个错误是,这个值明显低于1(它是一个比率而不是像素值)。一辆车在10米处的视差值可能是多少? - barisdad
你在哪里找到这个公式的? - jilles de wit
@barisdad:我认为现在我的回答可以算作是对你问题的实际回答了。 - jilles de wit
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接