从具有基本和基本矩阵的校准立体相机中找到点的真实世界坐标

Find real world coordinate of a point from calibrated stereo cameras with fundamental and essential matrix

我有一个立体相机设置有两个网络摄像头,我正在使用 Matlab。我校准了相机,并获得了 stereoParams。

然后,我希望用户能够 select 图片中的一个点,并获得图像中真实世界的点位置。我知道为此我需要基线、焦距和像素差异。我有像素差异,但如何获得基线和焦距?可以从 stereoParams 计算基线吗?

我不熟悉Matlab立体相机的标定函数,但一般来说,一旦你标定了每个相机,并找到了基本矩阵,你应该可以做到以下几点:

  1. 将其中一张图像设置为参考并校正另一张图像,使视差搜索沿图像中的水平线进行
  2. 从像素视差,可以通过关系z = fB/d计算真实世界的深度,其中f是焦距,B是基线,d是视差。注意单位很重要!如果 d 以像素为单位,那么如果您希望 z 以基线的单位(例如厘米)为单位,则 f 也必须以像素为单位
  3. 基线是相机光学中心之间的距离。它应该可以从 matlab stereoParameters.translationofCamera2
  4. 焦距是每个相机的固有参数。我假设上面的焦距相等,但对于网络摄像头,这并不能保证。您应该能够从 matlab cameraParameters.IntrinsicMatrix 中提取焦距。焦距与内在矩阵中的alpha参数有关(解释见这个Wikipedia entry

"pixel" 差异在校正后的图像坐标中定义。然而,由于您的真实相机通常不会完全平行和行对齐,因此有一个非恒等式转换可以纠正您的输入相机图像。因此,您需要 "undo" 校正才能在另一幅图像中找到与给定图像相对应的像素。程序如下:

  1. 用户在左侧图像中选择一个点,为您提供一对图像坐标 (xl, yl)。
  2. 对它们进行左校正变换,得到它们对应的左校正图像坐标。如果您使用一种常见的线性整流方法,则为 (xlr, ylr, wlr)' = Hlr * (xl, yl, 1)' ,其中 Hlr 是左整流单应性。
  3. 在(xlr / wlr, ylr / wlr)处查找视差图,得到像素的视差值d(这里我假设你的立体算法产生一个X坐标从左到右的视差图) .
  4. 则右校正图像中的匹配点为(xrr, yrr) = (d + xlr / wlr, ylr / wlr)
  5. 应用右整流变换的逆变换得到右图像坐标中的对应像素(xr, yr, wr)' = Hrr^-1 * (xrr, yrr, 1)'

请注意,所有这些操作只需要对每个像素执行一次,并且可以缓存。换句话说,您可以预先计算一个 "rectified" 2 通道视差图,它为每个像素产生一个从其在一幅图像中的坐标到另一幅图像中的相应像素的偏移量。地图本身可以存储为图像,其通道类型取决于视差范围 - 通常短整数就足够了,因为它可以表示 +- 32K 像素的偏移量。

您可以使用reconstructScene function, which will give you the 3D world coordinates for every pixel with valid disparity. In this example查找被检测人员质心的3D坐标。