将2D图像点转换为3D世界点

19

我知道在一般情况下,从3D到2D的转换是不可能的,因为深度信息会丢失。

然而,我有一个固定相机,我知道它的相机矩阵。我还有一个平面标定图案,其已知尺寸 - 假设在世界坐标中它的角落点是(0,0,0) (2,0,0) (2,1,0) (0,1,0)。使用opencv,我可以估计出这个图案的姿态,给出了将物体上的点投影到图像中的像素所需的平移和旋转矩阵。

现在:这种从3D到图像的投影很容易,但反过来怎么办呢?如果我选择了一个像素,我知道它是标定图案的一部分,那么如何得到相应的3D点呢?

我可以迭代地选择一些标定图案上的随机3D点,进行2D投影,并根据误差来细化3D点。但这似乎非常可怕。

考虑到这个未知点的世界坐标大约是(x,y,0) --因为它必须位于z=0平面上--似乎应该有一些转换我可以应用,而不是做这个迭代的无聊操作。但我的数学不是很好 - 有谁能计算出这个变换并解释一下如何推导出它?


我如何知道世界坐标(x,y,z)? - Clive
3个回答

16
这里提供一个闭合形式的解决方案,希望能对某些人有所帮助。按照您在上面评论中提到的约定(请参考图片),您可以使用中心归一化像素坐标(通常是在失真校正后)u和v以及外部校准数据,如下所示:
|Tx|   |r11 r21 r31| |-t1|
|Ty| = |r12 r22 r32|.|-t2|
|Tz|   |r13 r23 r33| |-t3|

|dx|   |r11 r21 r31| |u|
|dy| = |r12 r22 r32|.|v|
|dz|   |r13 r23 r33| |1|

有了这些中间值,您想要的坐标是:

X = (-Tz/dz)*dx + Tx
Y = (-Tz/dz)*dy + Ty
解释:

向量[t1,t2,t3]t是世界坐标系原点(校准图案的(0,0)点)相对于相机光学中心的位置;通过反转符号和反转旋转变换,我们得到向量T = [Tx,Ty,Tz]t,它是相机中心在世界参考框架中的位置。

同样,[u,v,1]t是观察点在相机参考框架中的向量(从相机中心开始)。通过反转旋转变换,我们得到向量d = [dx,dy,dz]t,它表示世界参考框架中的相同方向。

为了反转旋转变换,我们利用旋转矩阵的逆矩阵就是其转置矩阵的事实 (链接).

现在,我们有一个从点T开始的具有方向向量d的线,这条线与平面Z=0的交点由第二组方程给出。请注意,同样容易找到与X=0或Y=0平面或任何与它们平行的平面相交的交点。


在这种情况下,t3 = 1吗?以形成齐次坐标。 - user1538798
@user1538798:不是。[t1,t2,t3]是世界上的三维位置。 - Milo
有点困惑。如果[t1,t2,t3]是世界上的三维位置,那么T = [Tx,Ty,Tz]仍然是世界参考系中的三维位置吗? - user1538798
@user1538798:是的。请查看“解释”下面的段落。 - Milo
但是同一个矩阵将相机参考系中的向量[u v 1]转换为世界参考系中的[dx dy dz](在第二个方程中)。而同一个旋转矩阵将世界参考系中的[-t1 -t2 -t3]扭曲成相同世界参考系中的[Tx Ty Tz]? - user1538798

6
可以的。如果您有将3D世界中的点映射到图像平面的变换矩阵,您只需使用该变换矩阵的逆矩阵将图像平面上的点映射到3D世界中的点。如果您已经知道3D世界中该点的z = 0,则会得到该点的一个解决方案,无需迭代选择某些随机的3D点。我曾遇到类似的问题,我的车上安装了一个已知位置和相机校准矩阵的摄像头,我需要知道相机图像中捕获的车道标记的真实世界位置。

因此,以一个具体的例子来说,变换如下所示:这里。[X Y Z 1] 是世界坐标点,[u v 1] 是图像像素。我该如何反转中间部分? - FusterCluck
谢谢,这正是我解决问题所需要的提示。 我不能直接使用逆变换,因为相机点需要按一定比例缩放才能将物体点转换到z=0。但计算缩放比例很容易解决。 - FusterCluck

0

如果你的世界坐标点 Z=0(这应该是平面校准图案的真实情况),你可以计算相机和校准图案图像的单应性矩阵,而不是反转旋转变换。

当你有了单应性矩阵后,你可以选择图像上的点,然后使用逆单应性矩阵得到其在世界坐标系中的位置。只要世界坐标点在用于计算此单应性矩阵的点所在的平面上(在本例中为Z=0),就是正确的。

关于这个问题的方法也在 SO 的以下问题下讨论过:将2D图像坐标转换为Z = 0的3D世界坐标


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接