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

时间:2015-02-22 20:36:00

标签: matlab computer-vision triangulation matlab-cvst disparity-mapping

我有一台立体摄像机,配有两个摄像头,我正在使用Matlab。我校准相机,并获得stereoParams。

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

3 个答案:

答案 0 :(得分:1)

我不熟悉Matlab立体相机校准功能,但一般来说,一旦校准每台相机并找到基本矩阵,您应该能够做到以下几点:

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

答案 1 :(得分:0)

“像素”视差在校正的图像坐标中定义。但是,由于您的真实相机通常不会完全平行且行对齐,因此会有一个非标识转换来纠正您输入的相机图像。因此,您需要“撤消”整流,以便找到与给定图像对应的另一图像中的像素。程序如下:

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

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

答案 2 :(得分:0)

您可以使用reconstructScene功能,它会为每个有效差异的像素提供3D世界坐标。在此example中,您可以查找检测到的人的质心的3D坐标。