首页 文章

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

提问于
浏览
1

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

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

3 回答

  • 0

    我不熟悉Matlab立体相机校准功能,但一般来说,一旦校准每个相机并找到基本矩阵,您应该能够执行以下操作:

    • 将其中一个图像设置为参考并校正另一个图像,以便视差搜索沿图像中的水平线进行

    • 根据像素差异,您可以通过关系z = fB / d计算真实世界深度,其中f是焦距,B是基线,d是视差 . 关注这些单位非常重要!如果d是以像素为单位,那么如果你想要z以基线为单位(例如厘米),那么f也必须是像素

    • 基线是摄像机光学中心之间的距离 . 它应该可以从matlab stereoParameters.translationofCamera2获得

    • 焦距是每个摄像机的固有参数 . 我假设焦距相同,但是对于网络摄像头,这是不能保证的 . 您应该能够从matlab cameraParameters.IntrinsicMatrix中提取焦距 . 焦距与内在矩阵中的alpha参数有关(有关说明,请参阅此Wikipedia entry

  • 0

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

    • 用户选择左图像中的一个点,为您提供一对图像坐标(xl,y1) .

    • 对它们应用左校正变换,获得相应的左校正图像坐标 . 如果您使用常见的线性整流方法之一,则为(xlr,ylr,wlr)' = Hlr * (xl, yl, 1)',其中Hlr是左整流单应性 .

    • 在(xlr / wlr,ylr / wlr)处查找 Map 上的视差,获得像素的视差值d(这里我假设您的立体算法产生X坐标的从左到右的视差图) .

    • 右校正图像中的匹配点是(xrr,yrr)=(d xlr / wlr,ylr / wlr)

    • 应用右整流变换的反转以获得右图像坐标(xr,yr,wr)中的相应像素' = Hrr^-1 * (xrr, yrr, 1)'

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

  • 1

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

相关问题