2

如果之前有人问过,我很抱歉,但我找不到我的问题的正确答案。

为了更好地理解,让我简要解释一下我的问题的背景

语境

我有两个图像(A 和 B),上面有非平面对象。我希望能够从 A 获取像素 pA 的坐标并将其投影到 B 中。由于我的场景不是平面的,所以我不能使用单应性。我要做的是首先将我的像素 pA 投影到 3D 世界中,然后将结果投影到图像 B 中以获得 pB。pA (2D) -> pWorld (3D) -> pB (2D)。幸运的是,我知道 pworld 的坐标 z。我的问题涉及第一步 pA (2D) -> pWorld (3D)。

问题

如何将我的二维点 pA (u,v) 投影到世界中 (pWorld=(X,Y,Z)),给出 Z?我还有相机的外在矩阵 Rt (3x4) 和内在矩阵 K (3x3)。

我试过的

我知道 : s*(u v 1)' = K * Rt * (X Y Z)' [1]

s 是尺度。但我想有相反的过程, Z 被给出。就像是:

(X Y) = SOMETHING * (u v)

我可以重写 [1] 得到 s*(u v 1/s 1/s)' = G * (X Y Z 1)'

与 G = (l1 l2 l3 l4) (l 表示线)

l1 = (K*Rt) 的第一行

l2 = (K*Rt) 的第二行

l3 = 0 0 1/Z 0

l4 = 0 0 0 1

G 是可逆的,然后我可以有 (X Y Z 1)' = inv(G) * (us vs 1 1)'

但我不能使用它,因为我不知道规模。我想我对这个规模的事情有点困惑。我知道通常我们会正常化以摆脱它,但在这里,我不能。

也许这不是继续的好方法。如果有人能解释我的好方法,我会很高兴听到它。

先感谢您。

4

1 回答 1

0

我找到了一个解决方案,但它非常丑陋。

让我们考虑 3x4 矩阵 M:

M = K*Rt = (mij) 1<i<3, 1<j<4

为简化起见,我们还考虑系数 A 和 B:

A = (m12-m32*u)/(m22-m32v)
B = (m31*u-m11)/(m31*v-m21)

符号解释了,让我们继续讨论系统。正如我所说,该系统是:

s*(u v 1)' = M*(X Y Z 1)'

我们有3 个方程3 个未知数: s 、XY。我们可以注意到:

s = m31*X + m32*Y + m33*Z + m34

请注意,如果您想投影到相机坐标系而不是世界坐标系中(类似于没有旋转和平移的情况),您有 s = Z 这是一种更容易解决的系统(示例here To使用 OpenCV 从屏幕坐标计算世界坐标

考虑到这一点,我们可以将原始系统简化为具有2 个未知数XY )的2 个方程的系统:

然后,经过一些计算,我们最终得到:

X = [Z*((m23-M33*v)*A-m13+m33*u) + (m24-m34*v)*A-m14+m34*u ] / [A*(m31*v-m21)-m31*u+m11]

Y = [Z*((m13-m33*u)-B*(m23-m33*v)) + m14-m34*u-B*(m24-m34*v)] / [B*(m22-m32*v)-m12+m32*u]

它是 u、v 和 Z 函数中 X 和 Y 的表达式。我在我的项目中对其进行了测试,它正在工作。

不知道是否有更简洁的计算方法(使用 Matrix 和其他东西),但这就是我现在能想到的。

于 2018-11-21T08:16:36.893 回答