17

我知道在一般情况下,进行这种转换是不可能的,因为从 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 平面上 - 似乎应该有一些我可以应用的转换,而不是做迭代废话. 虽然我的数学不是很好 - 有人可以计算出这个转换并解释你是如何推导出它的吗?

4

3 回答 3

15

这是一个封闭形式的解决方案,我希望可以帮助某人。使用上面评论中图像中的约定,您可以使用居中归一化像素坐标(通常在失真校正之后)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 平面或与它们平行的任何平面的交点。

于 2013-01-30T10:54:13.687 回答
5

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

于 2013-01-25T12:43:05.637 回答
0

如果您在世界坐标中为您的点设置 Z=0(这对于平面校准图案应该是正确的),而不是反转旋转变换,您可以从相机和校准图案计算图像的单应性。

当您有单应性时,您可以选择图像上的点,然后使用逆单应性获取其在世界坐标中的位置。只要世界坐标中的点与用于计算此单应性的点在同一平面上(在这种情况下 Z = 0),这是正确的

这个问题的方法也在下面这个问题上讨论过:Transforming 2D image coordinates to 3D world coordinates with z = 0

于 2018-08-13T09:30:09.623 回答