使用 Ladybug 相机呈现的几何视觉

相机系统的六个传感器通过精确校准传感器的物理位置和方向以及镜头的失真模型,从而实现有效的图像变形和图像拼接。此校准还能够对图像数据进行摄影测量分析。本应用说明描述了如何在相机坐标系和单个传感器之间进行映射。

Ladybug 相机上的坐标系

每个镜头都有自己的右手 3D 坐标系。还有一个Ladybug 3D 坐标系,它与整个相机相关联。这使每个 Ladybug 相机上总共有七个 3D 坐标系。此外,每个传感器都有一个 2D 像素网格坐标系。

镜头 3D 坐标系

六个镜头中每个镜头都有自己的右手 3D 坐标系。

  • 原点是镜头的光学中心
  • Z 轴从传感器指向场景–即光轴
  • X 轴和 Y 轴相对于与该镜头相关的图像传感器的像素网格
    • Y 轴指向图像列。Y 轴正方向为升序行号的方向。这从法线方向图像的视点指向下方
    • X 轴指向图像行。X 轴正方向为升序列号的方向。这指向法线方向图像的右侧
  • 此坐标系用于表示每个镜头/传感器的视点的 3D 空间。其单位是米,而不是像素。


图 1:3D 传感器坐标

传感器 2D 坐标系

每个传感器都有自己的右手 3D 坐标系。

  • u 轴和 v 轴是基于图像的校正后的图像空间的 2D 图像坐标系,以像素为单位测量
  • 坐标系的原点位于光轴和校正后图像平面的交点处,每个传感器的坐标系的原点都不同
  • u 轴沿图像传感器行指向升序列号方向(即向右)
  • v 轴沿列指向升序行号方向(即向下)。


图 2:2D 传感器坐标

Ladybug 相机坐标系

Ladybug 相机坐标系位于 Ladybug 外壳的中心,由 6 个镜头坐标系的位置决定。

  • 原点是五个水平摄像头原点的中心
  • Z 轴平行于顶部镜头的光轴(镜头 5)(*)
  • X 轴平行于镜头 0 的光轴 (*)
  • Y 轴与基于 X 轴和 Z 轴的右手坐标系一致
  • LD2 – LD3 – LD5可能会有一些变化
  • (*) 注意 –由于装配容差,镜头 5 和镜头 0 的光轴通常不会完全垂直。Ladybug 相机坐标系的 X 轴经过微调,以确保它们垂直。


图 3:全局坐标

相对镜头坐标系和 Ladybug 坐标系

可从 Ladybug API 检索每个镜头坐标系相对于 Ladybug 坐标系的位置。首先,使用 ladybuggeom.h 中定义的 ladybugGetCameraUnitExtrinsics() 检索 3D 变换和欧拉角旋转。

/**
* 获取指定相机单元的 6-D 外参矢量。
*
* 6-D 外参矢量符合 EulerZYX 惯例(参见 Craig 的
*《机器人学导论》 第 45-49 页)。外参分量的
* 顺序为:
*
* - 元素 0 - Rx - 绕 X 轴旋转(弧度)
* - 元素 1 - Ry - 绕 Y 轴旋转(弧度)
* - 元素 2 - Rz - 绕 Z 轴旋转(弧度)
* - 元素 3 - Tx - 沿 X 轴平移(米)
* - 元素 4 - Ty - 沿 Y 轴平移(米)
* - 元素 5 - Tz - 沿 Z 轴平移(米)
*
* 所谓外参,意思是指对应的 4x4 变换矩阵
* 允许将本地相机单元坐标中的点映射到
* Ladybug 坐标系中的坐标。其中 s=sin,c=cos,矩阵的格式
* 如下所示。
*
* 示例:
* 要将其映射到 Craig 的矩阵中:
* - Rz = α
* - Ry = β
* - Rx = γ
*
* - |X'| |((cRz)(cRy)) ((cRz)(sRy)(sRx)-(sRz)(cRx)) ((cRz)(sRy)(cRx)+(sRz)(sRx)) Tx||X|
* - |Y'|=|((sRz)(cRy)) ((sRz)(sRy)(sRx)+(cRz)(cRx)) ((sRz)(sRy)(cRx)-(cRz)(sRx)) Ty||Y|
* - |Z'| |((-sRy)) ((cRy)(sRx)) ((cRy)(cRx))) Tz||Z|
* - |1 | |0 0 0 1 ||1|
*
* @param context - 要访问的 LadybugContext。
* @param uiCamera - 感兴趣的相机指数。
* @param ardEulerZYX - 返回的 6-D EulerZYX 外参矢量。
*
* @return A LadybugError 表示该函数成功。
*/
LADYBUGDLL_API LadybugError
ladybugGetCameraUnitExtrinsics(
LadybugContext context,
unsigned int uiCamera,
double ardEulerZYX[6] );

请注意,该函数注释说明了如何将提供的欧拉角(Rx、Ry、Rz)和平移(Tx、Ty、Tz)转换为 4x4 变换 T。使用标准齐次变换公式:

在适当的坐标系中。


一旦获得此齐次变换,它就可以用于计算 Ladybug 坐标系中的镜头坐标系原点,或 Ladybug 坐标系中镜头坐标系的坐标轴,反之亦然。

将像素位置转换为 3D 射线

使用 Ladybug 相机进行几何视觉时的一个常见任务是将特定图像中的像素位置解释为 Ladybug 坐标系中的 3D 射线。存在可以从中提取像素的各种图像空间,例如球型、圆柱形、校正或原始图像空间。鼓励用户将原始图像用于此类应用。原始图像是唯一未重采样的图像,因此在查找或跟踪图像特征时可提供最佳精确度。

要将原始图像中的像素位置转换为 Ladybug 坐标系中的 3D 射线,应采取以下步骤:

1. 使用 ladybugGetCameraUnitFocalLength() 获取相应镜头的焦距

2. ladybugGetCameraUnitImageCenter() 获取镜头的图像中心

3. 使用 ladybugGetCameraUnitExtrinsics() 获取相机的 6D 外参矢量(欧拉角和平移)

4. 使用 ladybugRectifyPixel() 校正 2D 像素位置

5. 查找此校正图像位置的(u,v)像素坐标

6. 将校正后的 2D 像素位置变换成本地相机坐标系内的 3D 射线

7. 在 Labybug 坐标系中将局部 3D 射线转换为 3D 射线

要从校正(列、行)图像位置查找(u,v)像素位置,必须考虑图像中心信息:

其中 等于像素行位置, 等于图像中心行位置。

通过使用标准针孔相机模型解释校正图像,可以将校正图像位置(u,v)转换为局部 3D 射线值。请注意,为摄像机获得的焦距和图像中心以像素为单位,仅适用于指定相机的校正图像。为了从经校正的 2D 像素位置计算局部 3D 射线,Z 是任意的,并且可以设置为 1。然后应用针孔模型方程,可以得出:

矢量 。要将此矢量转换为 Ladybug 坐标系,只需应用第 1.5 节中所示的齐次变化的 3x3 旋转分量:

其中 R 是 T 的左上角 3x3 子矩阵。此矢量的原点将是转换为 Ladybug 相机坐标系的局部坐标系的原点,或

将像素位置转换为镜头偏移校正的 3D 射线

由于每个镜头中心都与 Ladybug 坐标系的中心有偏移,因此将 2D 原始像素映射到 3D 射线的过程很复杂。为了获得最准确的结果,射线必须同时具有起点和方向,而不仅仅是从 Ladybug 坐标系中心发出的方向。

映射原始像素分两个步骤进行:

1. 将原始像素映射到其校正坐标 – API: ladybugRectifyPixel()

/**
* 将失真(原始)像素位置映射到校正图像的
* 对应点。
*
* 该函数必须在 ladybugSetOffScreenImageSize() 之后调用,
* 该函数设置校正图像的分辨率。
*
* @param context - 要访问的 LadybugContext。
* @param uiCamera - 此图像对应的相机指数。
* @param dDistortedRow - 要映射的失真(原始)像素的行坐标。
* @param dDistortedCol - 要映射的失真(原始)像素的列坐标。
* @param pdRectifiedRow - 返回校正图像中同一点
* 行坐标的位置。
* @param pdRectifiedCol - 返回校正图像中同一点
* 列坐标的位置。
*
* @return A LadybugError 表示该函数成功。
* 如果任何通道所选区域的
* 平均强度超过 254/255,则返回 LADYBUG_OVEREXPOSED。
*
* @see ladybugSetOffScreenImageSize()
*/
LADYBUGDLL_API LadybugError
ladybugRectifyPixel(
LadybugContext context,
unsigned int uiCamera,
double dDistortedRow,
double dDistortedCol,
double* pdRectifiedRow,
double* pdRectifiedCol

2. 将校正后的坐标映射到射线位置和方向 – API: ladybugRCtoXYZ()

/**
* 将特定相机单元上的 2D 点投影到 Ladybug 坐标系中的
* 3D 射线中。射线被定义为其起点和方向。
* 起点考虑相机单元与
* ladybug 相机中心偏移,这使得在不同于拼接半径的距离处
* 精确投影射线。
*
* @param context - 要访问的 LadybugContext。
* @param dRectifiedRow - 2D 输入点的校正行。
* @param dRectifiedCol - 2D 输入点的校正列。
* @param uiCamera - 相机单元。
* @param pdLocationX - 输出射线位置 x 分量。
* @param pdLocationY - 输出射线位置 y 分量。
* @param pdLocationZ - 输出射线位置 z 分量。
* @param pdDirectionX - 输出射线方向 x 分量。
* @param pdDirectionY - 输出射线方向 y 分量。
* @param pdDirectionZ - 输出射线方向 z 分量。
*
* @return A LadybugError 表示该函数成功。
*/
LADYBUGDLL_API LadybugError
ladybugRCtoXYZ(
LadybugContext context,
double dRectifiedRow,
double dRectifiedCol,
unsigned int uiCamera,
double* pdLocationX,
double* pdLocationY,
double* pdLocationZ,
double* pdDirectionX,
double* pdDirectionY,
double* pdDirectionZ);

该映射类型的示例代码以及其他不严重依赖 API 功能的映射类型,可在 Ladybug SDK 随附的 ladybugTranslate2dTo3d 示例中获得。

将 3D 点转换为像素位置

将第 1.6 和 1.7 节中描述的像素转换为 3D 问题略微复杂,因为需要首先找到 3D 点将投影到哪个镜头中。否则,可以直接使用函数 ladybugXYZtoRC() 完成。函数头信息如下所示。

/**
* 将 3D 点(相对于 Ladybug 坐标系)投影到
* 指示的相机单元,并返回其将位于其校正图像的
* 位置。
*
* @param context - 要访问的 LadybugContext。
* @param dLadybugX - 要投影的点的 X 坐标。
* @param dLadybugY - 要投影的点的 Y 坐标。
* @param dLadybugZ - 要投影的点的 Z 坐标。
* @param uiCamera - 此图像对应的相机指数。
* @param pdRectifiedRow - 返回的 3D 点所在的校正行位置
* (如果该点为投影到校正图像,
* 则将则小于 0)。
* @param pdRectifiedCol - 返回的 3D 点所在的校正列位置
* (如果该点为投影到校正图像,
* 则将则小于 0)。
* @param pdNormalized - 从校正像素到焦点中心的距离
* 以焦距为标准。如果调用者对此值不感兴趣,
* 可设置为 NULL。
*
* @return A LadybugError 表示该函数成功。
*/
LADYBUGDLL_API LadybugError
ladybugXYZtoRC(
LadybugContext context,
double dLadybugX,
double dLadybugY,
double dLadybugZ,
unsigned int uiCamera,
double* pdRectifiedRow,
double* pdRectifiedCol,
double* pdNormalized);

为了确定一个 3D 点将投影到哪个镜头中,该函数可用于 6 个镜头位置中的每一个(通过适当设置 uiCamera 参数)。如果返回代码成功 (LADYBUG_OK),则由 dLadybugX、Y 和 Z 定义的 3D 点就会投影到相机 uiCamera 中的 pdRectifiedRow 和 pdRectifiedCol 提供的校正行和列位置。可以使用 ladybugUnrectifypPixel 来确定原始图像中像素的位置。

校准精确度

Ladybug 相机的平均精确度在 10 m 距离为 2 mm,即 0.0116 度,如下图所示。

ladybug_3dray.jpg

局部到 Ladybug 转换误差

相对于 Ladybug 相机坐标系,数学模型与镜头的实际位置和方向匹配程度存在误差。这与实际物理位置与相机校准期间计算的位置之间的差异有关。

这与以下方面有关:
相对镜头坐标系和 Ladybug 坐标系
将 3D 点转换为像素位置

校正错误

数学模型与潜在的镜头失真的匹配程度存在误差。

这与以下方面有关:
将像素位置转换为 3D 射线
将 3D 点转换为像素位置

相机中心视差误差

视差误差是额外的误差来源,不包括在上述 10 米距离为 2 毫米的精确度内。

视差误差是从两个不同的起始位置指向同一目的地的两条射线之间的差异。在这种情况下,位置差异在镜头中心和相机坐标中心之间。

下图显示了在镜头中心位于实际位置和透镜中心位于 Ladybug 坐标系中心之间时。观察 3D 空间中同一点的角度差。

LD6 Equator Lens Parallax.png

LD6 Top Lens Parallax.png

5p-Equator Lens Parallax.png

5p-Top Lens Parallax.png