从视差图获取真实深度

6

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

距离 = 焦距 * 基线距离 / 视差

问题是:

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

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


为什么我得到了负的视差值?据我所知,它应该是正的。这与相机的方向有关吗? - user3291650
3个回答

5

首先需要进行相机标定,获取适当的参数,称为“相机矩阵”。相机标定是必须要执行的步骤。

一旦有了这些值,您可以使用校正后的值(从相机标定步骤获得的值,称为“重映射”或“去畸变”)对视差图进行适当的计算,然后最终计算出真实深度(以毫米或米为单位):

depth = baseline * focal / disparity

1
这里有两个问题:
  1. 单位。假设你的相机已经校准好,那么视差的单位就是毫米或其他公制单位,因为你已经知道了焦距是像素。可以参考我对同样问题的回答here

  2. 如果三维点在两个平行的摄像头前方,那么视差不能为负。如果坐标轴不重合或者相机未校准,则可能会出现负值。详见question


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

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