【问题标题】:camera extrinsic calibration相机外部校准
【发布时间】:2015-07-04 12:12:50
【问题描述】:

我有一个鱼眼相机,我已经校准过了。我需要通过使用所述棋盘的单个图像、内在参数和棋盘正方形的大小来计算与棋盘相关的相机姿势。不幸的是,许多校准库首先从一组图像计算外在参数,然后是内在参数,这本质上是我想要的“逆”过程。当然,我可以将我的棋盘图像放在我用于校准的其他图像集中,然后再次运行校准程序,但这非常繁琐,而且我不能使用与用于校准的棋盘大小不同的棋盘内在校准。谁能指出我正确的方向?

编辑:阅读 francesco 的回答后,我意识到我没有解释校准相机的意思。我的问题始于我没有经典的内在参数矩阵(所以我实际上不能使用 Francesco 描述的方法)。事实上我用 Scaramuzza 的程序(https://sites.google.com/site/scarabotix/ocamcalib-toolbox)校准了鱼眼相机,基本上找到一个将 3d 世界点映射到像素坐标的多项式(或者,将像素反向投影到单位球体的多项式)。现在,我认为这些信息足以找到 w.r.t 的相机姿势。一个棋盘,但我不确定如何进行。

【问题讨论】:

  • 假设您有两条光线在归一化坐标中穿过正方形边的定界点r1 = (x1,y1,1)r2 = (x2,y2,1)。知道在世界坐标中,光线由一段长度为w(正方形的宽度)的线段连接形成一个三角形,并且世界坐标中点的坐标将是归一化坐标的倍数,你能恢复通过在系统中的多个点上使用这些约束来摆姿势?只是一个想法
  • 是的,这是我的想法之一:基本上我必须找到一个特定的平面,通过投影图像中的所有棋盘角,我得到具有正确正方形大小的原始棋盘和垂直的边。所以就像我有一个参数平面,我需要找到它的参数,从而找到姿势。但我不确定如何在数学上将问题形式化。

标签: computer-vision camera-calibration extrinsic-parameters


【解决方案1】:

solvePnP 程序在摄像机坐标中计算棋盘 (CB) 的外部姿势。 openCV 在其 3D 重建模块中添加了一个 fishEye 库,以适应具有大视场的相机的显着失真。当然,如果您的内在矩阵或变换不是经典的内在矩阵,您必须修改 PnP:

  1. 撤消您所做的任何反投影
  2. 现在您有了所谓的归一化相机,其中消除了固有矩阵效应。

    k*[u,v,1]T = R|T * [x, y, z, 1]T

解决这个问题的方法是先写出k的表达式:

k=R20*x+R21*y+R22*z+Tz

然后在

中使用上面的表达式
k*u = R00*x+R01*y+R02*z+Tx
k*v = R10*x+R11*y+R12*z+Tx

您可以重新排列这些术语以得到 Ax=0,以 |x|=1 为条件,其中未知

x=[R00, R01, R02, Tx, R 10, R11, R12, Ty, R20, R2 1, R22, Tz]T

和 A, b 由已知的u、v、x、y、z-像素和CB角坐标组成;

然后求解 x=V 的最后一列,其中 A=ULVT,并从 x 组装旋转和平移矩阵。然后,对于这种处理来说,实际上非常典型的“杂乱”步骤很少:

A.确保你有一个真正的旋转矩阵 - 在你的 R2 = UVT 上执行正交 Procrustes,其中 R=ULVT

B.计算比例因子scl=sum(R2(i,j)/R(i,j))/9;

C.更新平移向量 T2=scl*T 并检查 Tz>0;如果是负数,则取反T,取反R;

现在,R2、T2 为您提供了一个很好的非线性算法优化起点,例如 Levenberg Marquardt。这是必需的,因为先前的线性步骤仅优化参数的代数误差,而非线性步骤优化正确的度量,例如像素距离的平方误差。但是,如果您不想遵循所有这些步骤,您可以利用 openCV 的 fish-eye library

【讨论】:

  • 我认为 3D 点只是“真实”棋盘的角,Z 分量都为零。我实际上试图做你弗拉德所描述的事情,事实上我阅读了校准工具箱所基于的论文并提出了一个齐次方程系统(所以没有“b”向量,因为所有常数项都是零) .不幸的是,试图用 Matlab 解决它会导致一个简单的解决方案(空向量)。不知道这里出了什么问题。
  • aledalgrande,您知道棋盘 (CB) 的正方形大小(例如 sz)吗?您只需在其上放置一个局部坐标系并将角设为 x=isz, y=j i>sz,z=0;请注意,这是链接到 CB 的局部坐标系,而不是相机中心。
  • Alb,我的错,即插即用不是最小二乘而是最小方向问题,为了避免琐碎的解决方案,它通过约束 |x|=1 解决;为了解决它,使用 A 的 SVD(奇异值分解)并拾取 V 的最后一列(它对应于 A 的协方差椭圆的最小轴或最小奇异值)。我更新了我的答案,见上文。
  • 您好弗拉德,感谢您的意见。你知道我在哪里可以找到关于你所描述的程序的更详细和正式的东西吗?我想实现它并编写一些文档,所以我想清楚地了解我在做什么。另外,我不明白 R2 矩阵是什么。如果我从超定系统计算 SVD,那么 U 是 mxm 而 V 是 nxn 维度,那么 R2 = UV' 是什么意思?
  • 嗨,Alb,旋转矩阵是方形的,所以 m=n; SVD 的重点是确保旋转不受缩放的污染。正式来说,一本好书是 Simon Prince 的《计算机视觉》。它有精装本和在线版,附有实用算法实现(伪代码)的精美小册子:computervisionmodels.com 参见第 15 章和第 16 章,了解单相机和立体相机,第 14 章介绍图像处理。附录非常简洁,有助于理解优化和矩阵运算
【解决方案2】:

我假设“校准”是指您的相机有一个针孔模型。

那么你的棋盘平面和图像平面之间的变换是一个单应性,你可以使用通常的 DLT 算法从角的图像估计。然后,您可以将其表示为内部参数 A 和 [xyt] 矩阵的乘积,其中 x 和 y 列是世界(即棋盘)坐标系的 x 和 y 单位向量,t 是从相机中心到同一帧原点的向量。那就是:

H = 尺度 * A * [x|y|t]

因此

[x|y|t] = 1/尺度 * inv(A) * H

选择比例以使 x 和 y 具有单位长度。一旦有了 x 和 y,第三个轴就是它们的叉积。

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 2015-09-24
    • 2013-01-28
    • 2014-10-23
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多