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

问题描述

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

我知道:

  • 像素坐标 (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]

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

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

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...