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

时间:2013-01-25 02:23:52

标签: opencv computer-vision

我知道在一般情况下,由于深度信息从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平面上 - 似乎应该有一些我可以应用的转换,而不是做迭代的废话。我的数学不是很好 - 有人可以解决这个转变并解释你是如何得出它的吗?

3 个答案:

答案 0 :(得分:12)

这是一个封闭的表单解决方案,我希望可以帮助某人。使用上面评论image中的约定,您可以使用居中标准化像素坐标(通常在失真校正后)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 ,它代表了世界参考系中相同的方向。

为了反转旋转变换,我们利用旋转矩阵的逆是其转置(link)的事实。

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

答案 1 :(得分:4)

是的,你可以。如果您有一个将3d世界中的点映射到图像平面的变换矩阵,则可以使用此变换矩阵的逆矩阵将图像平面点映射到3d世界点。如果您已经知道3d世界点的z = 0,那么这将导致该点的一个解。不需要迭代地选择一些随机的3d点。我遇到了类似的问题,我将相机安装在具有已知位置和相机校准矩阵的车辆上。我需要知道在相机的图像位置捕获的车道标记的真实世界位置。

答案 2 :(得分:0)

如果您在世界坐标中的点为Z = 0(对于平面校准图案应该为真),则可以通过相机和校准图案为图像计算单应性,而无需反转旋转变换。

具有单应性时,您可以选择图像上的点,然后使用反单应性获得其在世界坐标中的位置。 只要世界坐标中的点与用于计算该单应性的点在同一平面上(在这种情况下,Z = 0)就可以实现

此问题的解决方法也在SO上的该问题下面讨论:Transforming 2D image coordinates to 3D world coordinates with z = 0