1

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

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

4

2 回答 2

0

我假设“校准”意味着您的相机有一个针孔模型。

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

H = 比例 * A * [x|y|t]

所以

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

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

于 2015-04-27T01:04:44.153 回答
0

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=[R 00 , R 01 , R 02 , T x , R 10 , R 11 , R 12 , T y , R 20 , R2 1 , R 22 , T z ] T

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

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

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

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

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

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

于 2015-04-30T07:04:08.207 回答