3d 世界中给定Z的二维到三维投影
如果以前有人问过,我很抱歉,但是我找不到我问题的正确答案 为了更好地理解,让我简要地解释一下问题的背景 上下文 我有两个图像(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) 我尝试的 我知道: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) 问题 如何将我的
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,X和Y。
我们可以注意到:
s = m31*X + m32*Y + m33*Z + m34
请注意,如果要投影到摄影机坐标系而不是世界坐标系(类似于没有旋转和平移的情况),则可以使用s=Z,这是一种更易于系统求解的方法(此处示例)
考虑到这一点,我们可以将原始系统简化为具有两个未知量的2个方程的系统(X和Y):
然后,经过一些计算,我们最终得到:
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]