从视差图中获取真实深度

时间:2014-04-13 06:36:16

标签: opencv computer-vision stereo-3d

我希望从立体相机获得物体的真实距离。我正在使用学习OpenCV O'Reilly书中给出的OpenCV示例代码。获得视差图后,我想使用公式:

距离=焦点长度*基线距离/视差

问题是:

  1. 我得到了差异的负面价值。如何转换这些值以便它们可以用于实际的深度计算?

  2. 在上面的公式中,焦距和基线距离以mm为单位(由重投影矩阵返回),而视差将以像素为单位。因此结果将是mm ^ 2 /像素。如何将视差值从像素转换为mm。

4 个答案:

答案 0 :(得分:2)

您需要先执行 camera calibration 步骤,以获取适当的参数,称为相机矩阵

拥有一个这些值,就可以使用校正后的值对 disparity map 进行正确的计算(从相机校准步骤获得的一个值,称为 remapping < / em>或 undistortion ),然后,要获得真实的深度(以毫米或米为单位),您可以执行以下操作:

depth = baseline * focal / disparity

答案 1 :(得分:0)

将差异转换为距离的简单公式是针对平行相机的情况编写的,并且差异以度量单位表示(mm,在您的情况下)。

在实践中,使用OpenCV,并假设您的立体声装备经过校准,您将使用reprojectImageTo3D

之类的例程执行密集三角测量

答案 2 :(得分:0)

您可以使用CV立体声对应功能,例如立体声块匹配或半全局块匹配。这将为您提供整个图像的视差图,可以使用Q矩阵(cv :: reprojectImageTo3D)将其转换为3D点。

答案 3 :(得分:0)

这里有两个问题:

  1. 单位。假设您的相机已校准,则焦距为像素,因此视差单位为 mm 或任何其他公制单位。看到我对同一问题的回答 here

  2. 如果3D点位于两个彼此平行的摄像机的前面,则视差不能为负。如果轴会聚或相机未校准,则可能会发生。有关详情,请参见此question