我看到了很多类似的问题,但不是这个确切的问题。
我知道:
- 像素坐标(u,v)和深度(d)- 4个点
- 对应的世界坐标(x,y,z)-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]
这个转换工作,我的像素坐标u,v是正确的。
2.像素坐标+世界坐标点深度:
camera_coordinates = ( inv(K) * [u, v, 1] ) * d
world_coordinates = inv(M_ext) * [camera_coordinates, 1]
这种逆转换不会产生我的世界坐标点。有人知道我的错误在哪里吗?
1条答案
按热度按时间hmtdttj41#
首先,对不起之前。那我就得说我跟你的情况一样,问题已经解决了。我尝试了几种不同的策略,以下两种方法解决了我的问题:
策略#1
1.从我的校准图像集中剔除了一些图像。
1.再次校准了我的相机。
1.使用新参数应用逆转换。
问题解决了!
策略#2
1.拍摄了更多的cal-tab图像并添加到图像集。
1.再次校准了我的相机。
1.使用新参数应用逆转换。
问题解决了!
我认为这个问题是由一些离群数据时,试图校准相机。但是我没有看opencv的源代码,所以我不太清楚。希望我的经验能有所帮助。