Rotation/translation 矢量不正确

Rotation/translation vector incorrect

我根据以下标准校准了相机:

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpointslist, imgpointslist, imsize, None, None)

结果是:

rvecs = array([[ 0.01375037],
               [-3.03114683],
               [-0.01097119]])
tvecs = array([[ 0.16742439],
               [-0.33141961],
               [13.50338875]])

我根据以下公式计算了旋转矩阵:

R = cv2.Rodrigues(rvecs)[0]
R = array([[-0.99387165, -0.00864604, -0.11020157],
           [-0.00944355,  0.99993285,  0.00671693],
           [ 0.1101361 ,  0.00771646, -0.99388656]])

并创建了一个 Rt 矩阵,导致:

Rt = array([[-0.99387165, -0.00864604, -0.11020157,  0.16742439],
            [-0.00944355,  0.99993285,  0.00671693, -0.33141961],
            [ 0.1101361 ,  0.00771646, -0.99388656, 13.50338875],
            [ 0.        ,  0.        ,  0.        ,  1.        ]])

现在,当我尝试根据以下条件获取图像中真实世界坐标 [0, 0.4495, 0] 的位置时:

realworldpoint = array([0.    , 0.4495, 0.    , 1.    ], dtype=float32)
imagepoint = np.dot(Rt, realworldpoint)

我得到:

array([ 0.16353799,  0.1180502 , 13.5068573 ,  1.        ])

而不是我在图像中预期的 [1308, 965] 位置:

array([1308,  965,  0,  1])

我怀疑校准相机功能中旋转矩阵和平移向量输出的完整性,但也许我遗漏了什么? 我仔细检查了 OpenCV 的校准相机功能的输入(objpointslist:April 标记 Aruco 标记中心的 3d 坐标,以及 imgpointslist:图像中标记中心的 2d 位置),但这些都是正确的.. .

你们谁能帮帮我吗?

我根据OpenCV的校准程序使用了这个程序:

编辑 (2022/02/03): 我能够解决它! 解决步骤:

  1. 求解 cv2.calibrateCamera() 以获得相机 intrinsics(相机矩阵)和 extrinsics(旋转和平移向量)
  2. 根据cv2.Rodrigues()
  3. 旋转向量计算旋转矩阵
  4. 创建 Rt 矩阵
  5. 利用一个已知点(uv1,它的XwYwZw1已知,2D和3D)计算比例因子(s)

注意:为了得到正确的比例因子,你必须除以 最终的等式因此你得到 [u v 1],所以除以 第三个元素变成一个,这导致你的比例因子:

既然 比例因子 已知,可以使用相同的等式计算图像中随机点的 XYZ 坐标 (uv1) 根据:

此解决方案的关键步骤是通过除以您在 [uv1] 矩阵中获得的第三个元素来计算比例因子。这使得该矩阵实际上 [uv1].

下一步是实施 镜头畸变 的解决方案。这很容易通过在图像 before[ 扭曲的 uv/xy 点 上使用 cv2.undistortPoints 来完成 将 u 和 v 提供给上面的等式以找到该点的 XYZ 坐标。

Rt 只是从 world 到 camera frame 的变换(旋转,平移)。

您期望投影

如果你想投射点,你仍然需要应用相机矩阵(然后可能是精确的畸变系数,但我们先不谈那个)。

解决方案中的关键步骤是通过除以您在 [uv1] 矩阵中获得的第三个元素来计算比例因子。 我对原问题进行了解释。以及解释涉及校正镜头畸变的下一步。