【问题标题】:Finding 3D coordinate when all 3 coordinates can vary in the object coordinate system当所有 3 个坐标在对象坐标系中都可以变化时查找 3D 坐标
【发布时间】:2014-03-01 06:25:14
【问题描述】:

我有我的目标在对象坐标系中的 4 个共面点的 3D 坐标。我在视频的每一帧中也有它们的 2D 坐标。我还计算了相机的内在参数 (M),对象坐标系和相机坐标系之间的 R(旋转)和 t(平移)矩阵,使用 solvepnp()。 我看过from here完整的流程,很清楚。和我走的流程也差不多。所以想用同一个方程


s [u v 1]T = M ( R [X Y Z]T + t)

用于计算我的 3D 坐标,但我没有常数,因为链接解释了用于计算 s。我的目标围绕 OpenCV 坐标系中的 x 轴旋转。我的问题是 -

  1. 谁能给我建议一个找到s的方法?这个计算绝对是强制性的还是我可以使用 s=1?
  2. 有没有其他方法可以用我有什么参数来计算 3d 点?


【问题讨论】:

  • 你的参数是MRtuv,对吧?

标签: ios opencv 3d 2d computer-vision


【解决方案1】:

变量s有一个特定的含义:2D点与其3D反投影之间存在一对多的对应关系。换句话说,有无数个可能的 3D 点位于最终终止于或从像素沿 u、v、f 方向发射的射线上。这就是 s 的含义:只是一对多关系的指示符。

当度量重建在比例上是模棱两可的时,Francesco 似乎谈到了运动结构的一般情况。然而,问题可能完全不同。让我改写一下,告诉我是否正确:你有一个你知道的静态对象坐标系。您有一个在该系统中围绕 X 轴旋转的目标,并且您知道该系统中 4 个点在零旋转时的 3d 坐标。要在旋转后获得新的 3D 坐标,您只需要一个旋转角度,同时为您提供一组已知点的 2D 投影。这是一个简单的任务;如果这是你真正追求的。

为什么任务很简单?每个点生成两个约束,如 u= v=;未知数是一 - 角度所以一点就足以计算它。知道这个角度后,您可以旋转已知的 3D 点来更新它们的坐标。总体来说只要 1 分就足够解决任务了:

  1. 将针孔相机方程的两边与左侧的固有矩阵的逆相乘以消除固有参数。你最终会得到这个: s' [u' v' 1]T = A [X Y Z]T + t,其中 A=R*Ralpha
  2. 技术上 Ralpha - 我们的未知数 - 仅取决于角度 alpha 但由于依赖是非线性的,我们可以使用具有 2 个条目的矩阵的线性乘法:s = sin(alpha) 和 c = cos(alpha), alpha -绕x轴旋转的角度

              1  0   0
    Ralpha =  0  c  -s
              0  s   c
    
  3. 去掉 s',注意 s' = a31X + a32Y + a32Z + tz 并将其插入两个约束:

    s'u' = (a31X + a32Y + a32Z + tz)u' = a11X + a12Y + a13Z + tx

    s'v' = (a31X + a32Y + a32Z + tz)v' = a21X + a22Y + a23Z + ty

求矩阵 A 现在是求解线性方程组 Kx=b 的简单任务,通过重新排列我们得到的项

b = [tx-tzu', ty-tzv'] T,

x = [a11, a12, a13, a21, a 22, a23, a31, a32, a33]T

对于单点对应K是

-X, -Y, -Z, 0,   0,  0, Xu’, Yu’, Zu’
 0,  0,  0, -X, -Y, -Z, Xv’, Yv’, Zv’

但是如果有更多的对应关系,可以添加更多的行。 用伪逆求解得到 x = (KTK)-1KTb, 可以通过二次残差的非线性最小化进一步优化。

在你计算出 x 并用它重新组装 A 之后,你必须确保它是一个真正的旋转矩阵。通常这是通过 SVD 完成的:A=ULVT,然后重新分配 A=UVT。最后,得到 Ralpha = RTA,它为您提供了一个旋转矩阵,您可以将其应用于您已知的 3D 坐标以获取它们在对象坐标系中的新值,或者使用整个矩阵 A 来获取它们在相机坐标系中。

这可能看起来很乱,但它是一组典型的获取外部相机参数的步骤,并且您已经完成了(尽管您可能使用了库函数)。

【讨论】:

  • 是的,弗拉德说的(我也错过了关于 OP 具​​有实际 3D 点的部分)。有一些注意事项: 1 - 我几乎不敢相信你有一个关于校准轴的纯旋转,除非你的装备是专门制造和校准的(即使用已与机械旋转轴仔细对齐的 OpenCV 校准目标) )。当然,如果您的世界坐标系是从单轴旋转推断出来的(即在相机校准期间围绕该轴移动校准目标,并拟合后记),这当然不适用。
  • 2 - 从 1 开始,您需要将完整的 3 轴旋转适合您的平面。
  • 3 - 无论如何,所有这些都是完全无关的。由于 3D 点的世界到相机转换是单应性,并且您知道平面上的物理对象大小,因此不需要使用校准设置:只需计算单应性,将其应用于 3D 点,然后缩放以保留对象的宽度/高度比。
  • 好点弗朗西斯科。必须知道内在矩阵才能分解 Homography 并获得 3D 点:M*R|T = H
  • 感谢您的所有回复和澄清。我是所有这些概念的初学者,所以我需要一些时间才能完全理解您的意思。我确实尝试了单应性分解,但无法得到任何好的结果。这就是为什么我使用 solvepnp() 来找到 R 和 t 矩阵。
【解决方案2】:

编辑:弗拉德可能最准确地解决了您的问题。以下内容可能仍有助于澄清一般情况下的数学。


如果您知道 R 和 t,那么您的问题可以简化为估计 (X0,Y0,Z0)以下等式,其中 M、u 和 v 已知:

su,v [u v 1]T = M [X0 Y0 Z0]T

注意 su,v 不是一个常数因子,而是取决于 u 和 v。由于 M 的特殊形式,它是对角线,最后一个元素等于 1,我们可以很容易地看到那 su,v=Z0。因此,如果你只知道 M、R、t、u 和 v,你只能估计 (X0/Z0,Y0 /Z0,1)。这意味着您无法估计两个不同图像点之间的相对深度(它们的深度都等于 1),因此您无法获得真正的 3D 重建。

为了估计两个图像点的相对深度,您需要对两个图像中的同一点至少有两次观察(由不同位置的相机获取)。而且,正如 Francesco 所指出的,即使您有两张图像,也无法估计重建场景的真实比例,除非您另外知道两点之间的真实 3D 距离 D。

【讨论】:

  • 似乎几乎每个人都忽略了问题第一句的重点:“我的目标在对象坐标系中的 4 个共面点的 3D 坐标”。这不是运动任务的一般结构。
  • @Vlad 是的,我在发布我的帖子后看到了你的答案,你可能是对的,我 +1 了你的帖子。但是,如果 OP 只使用一个固定摄像头,我的帖子可能会为他澄清一些事情......
【解决方案3】:

仅当您知道绝对比例时,例如图像中可见的已知对象的长度。

但是你真的关心绝对的规模和距离吗?你应该仔细考虑你的应用程序,然后决定你是否真的需要知道物理距离和大小。很难做到正确,尤其是在需要很高程度的准确性时,而且大多数情况下是没有必要的。

【讨论】:

  • 是的,我知道正在检测的目标的长度,但正如我所说,因为我的对象围绕 x 轴旋转,旋转不会影响长度吗?是的,我确实需要测量物理距离。
【解决方案4】:

要将单应矩阵(将世界中的一个平面映射到其图像)分解为旋转和平移,请遵循以下 5 个步骤:
1. 注意 M*[R|T]*[x, y, 0, 1]T 可以通过去掉 Z 坐标的占位符来简化。这相当于在平面上以 Z=0 的方式定位对象坐标系。
2. 请注意,这有效地消除了旋转矩阵中的第三列,因此针孔相机方程看起来像单应性:
s[u, v, 1]T = M * R|T * [x, y, 1] = H * [x, y, 1],其中 R|T=
r11 r12 tx
r21 r22 ty
r31 r32 tz
3. 现在将内在矩阵 M 合并到 Homography 中:
M * R|T = H,则 R|T = M-1H = H2。 使用 SVD 分解 H2:H2=ULVT 然后将表示缩放的 L 替换为 W ,使缩放均匀且单位为真实旋转; R|T 然后变成 UWVT,其中 W =
1 0
0 1
0 0
4.通过向量积r3=r1xr2计算R的第三列 保证它与前两个正交并且R是一个真正的旋转矩阵。
5. 您可以选择通过考虑缩放因子 k=sum(Rij/H2ij)/6 来恢复平移 T,其中 i=1..3 , j=1..2 然后计算 T = k* H2的第三列。最后如果 Tz

【讨论】:

    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多