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):
我能够解决它!
解决步骤:
- 求解 cv2.calibrateCamera() 以获得相机 intrinsics(相机矩阵)和 extrinsics(旋转和平移向量)
- 根据cv2.Rodrigues()
从旋转向量计算旋转矩阵
- 创建 Rt 矩阵
- 利用一个已知点(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] 矩阵中获得的第三个元素来计算比例因子。 我对原问题进行了解释。以及解释涉及校正镜头畸变的下一步。
我根据以下标准校准了相机:
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): 我能够解决它! 解决步骤:
- 求解 cv2.calibrateCamera() 以获得相机 intrinsics(相机矩阵)和 extrinsics(旋转和平移向量)
- 根据cv2.Rodrigues() 从旋转向量计算旋转矩阵
- 创建 Rt 矩阵
- 利用一个已知点(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] 矩阵中获得的第三个元素来计算比例因子。 我对原问题进行了解释。以及解释涉及校正镜头畸变的下一步。