关于opencv:将2D图像点转换为3D世界点

Converting a 2D image point to a 3D world point

我知道在一般情况下,这种转换是不可能的,因为深度信息从三维到二维都会丢失。

但是,我有一个固定的相机,我知道它的相机矩阵。我还有一个已知尺寸的平面校准模式——假设在世界坐标系中,它有角(0,0,0)(2,0,0)(2,1,0)(0,1,0)。使用opencv我可以估计模式的姿态,给出将对象上的一个点投影到图像中的一个像素所需的平移和旋转矩阵。

现在:这个三维到图像的投影很容易,但是另一种方法呢?如果我在我知道是校准模式的一部分的图像中选择一个像素,我如何才能获得相应的3D点?

我可以迭代地在校准模式上选择一些随机的三维点,投影到二维,并根据误差来优化三维点。但这似乎很可怕。

假设这个未知的点有世界坐标,比如(x,y,0),因为它必须位于z=0平面上,看起来应该有一些转换,我可以应用,而不是做迭代的废话。不过,我的数学不是很好——有人能算出这个转换并解释你是如何推导出来的吗?


这里有一个封闭式的解决方案,我希望能帮助别人。使用上面注释中图像中的约定,可以使用居中的标准化像素坐标(通常在畸变校正之后)U和V以及外部校准数据,如下所示:

1
2
3
4
5
6
7
|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|

对于这些中间值,您需要的坐标是:

1
2
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。

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

现在我们有一条方向向量为d的线,从点t开始,这条线与平面z=0的交点由第二组方程给出。请注意,同样容易找到与x=0或y=0平面或与其平行的任何平面的交点。


是的,你可以。如果您有一个将三维世界中的一个点映射到图像平面的变换矩阵,则可以使用该变换矩阵的逆矩阵将图像平面点映射到三维世界点。如果您已经知道三维世界点的z=0,这将导致该点的一个解决方案。不需要反复选择一些随机的三维点。我有一个类似的问题,我有一个摄像头安装在一辆车上,有一个已知的位置和摄像头校准矩阵。我需要知道一个真实世界的位置,一个车道标记捕捉到的图像地点的相机。


如果世界坐标中的点Z=0(平面校准模式应为0),则可以从相机和校准模式中计算图像的同形性,而不是反转旋转变换。

当你有同形时,你可以选择图像上的点,然后用反同形得到它在世界坐标中的位置。只要世界坐标中的点与用于计算同形性的点在同一平面上(在这种情况下,z=0),这是正确的。

这个问题的解决方法也在下面的SO问题中讨论过:将二维图像坐标转换为z=0的三维世界坐标