3d 世界中给定Z的二维到三维投影

3d 世界中给定Z的二维到三维投影,3d,camera,2d,projection,depth,3d,Camera,2d,Projection,Depth,如果以前有人问过,我很抱歉,但是我找不到我问题的正确答案 为了更好地理解,让我简要地解释一下问题的背景 上下文 我有两个图像(A和B),上面有非平面对象。我希望能够从a中获取像素pA的坐标,并将其投影到B中。因为我的场景不是平面的,所以我不能使用单应。我想做的是首先将我的像素pA投影到3D世界中,然后将结果投影到图像B中得到pB。 pA(2D)->pWorld(3D)->pB(2D)。 幸运的是,我知道pworld的坐标z。我的问题涉及第一步pA(2D)->pWorld(3D) 问题 如何将我的

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

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

上下文

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

问题

如何将我的2D点pA(u,v)投影到世界(pWorld=(X,Y,Z)),Z被给定? 我还有相机的外部矩阵Rt(3x4)和内部矩阵K(3x3)

我尝试的

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

s是刻度。 但我希望有相反的过程,Z被给定。比如:

(xy)=某物*(uv)

我可以重写[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 1/Z 0

l4=01

G是可逆的,我可以
(X Y Z 1)'=inv(G)*(美国vs 1 1)

但是我不能用它,因为我不知道刻度。我想我对这个比例有点困惑。我知道我们通常都想摆脱它,但在这里,我不能

也许这不是一个好办法。如果有人能给我解释一下,我真的很高兴听到这个消息


提前谢谢你。

我找到了一个解决方案,但它非常难看

让我们考虑3x4矩阵M:< /P>

M = K*Rt = (mij) 1<i<3, 1<j<4
符号解释了,让我们继续讨论系统。 正如我所说,这个制度是:

s*(u v 1)' = M*(X Y Z 1)'
我们有3个方程3个未知数s,XY。 我们可以注意到:

s = m31*X + m32*Y + m33*Z + m34
请注意,如果要投影到摄影机坐标系而不是世界坐标系(类似于没有旋转和平移的情况),则可以使用s=Z,这是一种更易于系统求解的方法(此处示例)

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

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

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]
它是X和Y在u、v和Z的函数中的表达式。 我用我的项目测试了它,它正在工作


我不知道是否有更干净的方法来计算(使用矩阵和其他东西),但这就是我现在能想到的所有方法。

它可以帮助你:谢谢你的回答。我确实查过了。这是一个比我更简单的例子,因为我的3D世界坐标系与我的3D相机坐标系不同。(s!=z)。我从这种计算中得到了灵感,找到了一个解决方案,但它非常难看。
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]