2D像素坐标到3D世界坐标使用opencv solvePnP

问题描述 投票:0回答:1

我看到了很多类似的问题,但不是这个。

我知道:

  • 像素坐标(u,v)和深度(d)——4个点
  • 对应的世界坐标(x,y,z)——4分
  • 相机的内在矩阵K(我还没有标定但是使用相机默认的)
  • 外部矩阵[R|t](我称它的4x4版本为M_ext
  • 从世界坐标点X(3D)到像素坐标点p(2D)
  • 的转换

我不知道:

  • 从像素坐标点p(2D)+深度d到世界坐标点X(3D)
  • 的转换

0。获取外部矩阵:

为了获得外部矩阵,我使用 opencvs 函数 solvePnP:

ret, rvec, tvec = cv.solvePnP(world_points, img_points, K, np.float32([]), cv.SOLVEPNP_IPPE)

我使用上面的旋转和平移向量 ( Rt = np.hstack((cv.Rodrigues(rvec)[0], tvec))) 得到外部矩阵 [R|

t
]。

我想应用这两种转换来验证我的外部矩阵是否正确。

1。世界坐标点到像素坐标:

camera_coordinates = K * M_ext * world_coordinates 
u = camera_coordinates[0] / camera_coordinates[2]
v = camera_coordinates[1] / camera_coordinates[2]

这个转换有效,我的像素坐标 u, v 是正确的。

2。像素坐标+深度到世界坐标点:

camera_coordinates = ( inv(K) * [u, v, 1] ) * d
world_coordinates = inv(M_ext) * [camera_coordinates, 1]

这种逆向转换不会产生我的世界坐标点。有人看到我的错误在哪里吗?

python opencv computer-vision coordinate-transformation camera-intrinsics
1个回答
0
投票

那你解决问题了吗?我也对此感到困惑。如果您能与我分享您的经验,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.