使用opencv solvePnP将二维像素坐标转换为三维世界坐标

gopyfrb3  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(505)

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

我知道:

  • 像素坐标(uv)和深度(d)- 4个点
  • 对应的世界坐标(xyz)-4点
  • 相机的固有矩阵K(我还没有校准,但使用相机默认值)
  • 外在矩阵[R|t](我称其为4x 4版本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)
我得到外矩阵[R|t]使用上面的旋转和平移向量(Rt = np.hstack((cv.Rodrigues(rvec)[0], tvec)))。
我想应用这两个转换来验证我的外部矩阵是正确的。

1.世界坐标指向像素坐标:

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

这个转换工作,我的像素坐标uv是正确的。

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

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

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

hmtdttj4

hmtdttj41#

首先,对不起之前。那我就得说我跟你的情况一样,问题已经解决了。我尝试了几种不同的策略,以下两种方法解决了我的问题:
策略#1
1.从我的校准图像集中剔除了一些图像。
1.再次校准了我的相机。
1.使用新参数应用逆转换。
问题解决了!
策略#2
1.拍摄了更多的cal-tab图像并添加到图像集。
1.再次校准了我的相机。
1.使用新参数应用逆转换。
问题解决了!
我认为这个问题是由一些离群数据时,试图校准相机。但是我没有看opencv的源代码,所以我不太清楚。希望我的经验能有所帮助。

相关问题