resolvePnP结果与预期结果(Python,OpenCV)相差太大

时间:2019-05-13 13:04:57

标签: python opencv camera-calibration pose-estimation opencv-solvepnp

我有一辆带摄像头,imu和gps的汽车。相机在行驶时拍照。图片和gps坐标已同步。现在,我正在尝试从图片中获得相机的姿势(相对于imu),但是solvePnP并没有获得与我的预期结果相似的外部相机校准。

更多背景信息:我将Python(3.6.8)与OpenCV 4.0.0结合使用。

我知道以下数据:

  1. 我有8个标记及其在世界坐标中的确切位置。
  2. 我在世界坐标系中有imu的轨迹。
  3. 我有几张图片(6576 x 4384 px)的标记的像素坐标。
  4. 我具有摄像机的固有校准功能。
In [4]: image_points
Out[4]:
array([[1911., 2115.],
       [2443., 2631.],
       [1427., 2570.],
       [1409., 2271.],
       [1396., 1912.],
       [1549., 1770.],
       [2247., 1787.],
       [2606., 1794.]], dtype=float32)

In [5]: world_points
Out[5]: 
array([[-1.5156984e+00, -1.3494657e+00,  0.0000000e+00],
       [-2.9987667e+00,  0.0000000e+00,  0.0000000e+00],
       [-9.3132257e-10,  0.0000000e+00,  0.0000000e+00],
       [ 0.0000000e+00, -8.5239327e-01,  0.0000000e+00],
       [-1.5532847e-02, -1.8538033e+00,  0.0000000e+00],
       [-5.0486135e-01, -2.2495930e+00,  0.0000000e+00],
       [-2.5055323e+00, -2.2484162e+00,  0.0000000e+00],
       [-3.4857810e+00, -2.2520051e+00,  0.0000000e+00]], dtype=float32)

In [6]: cameraMatrix
Out[6]: 
matrix([[ 2.81923164e+03, -1.36877792e+00,  3.26989822e+03],
        [ 0.00000000e+00,  2.81857995e+03,  2.24198230e+03],
        [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])

In [7]: distCoeffs
Out[7]: array([ 0.0278163 , -0.01819595, -0.01031101, -0.0023199 , -0.02813449])

当前,我的流程包括:

  1. 我将所有世界坐标转换为本地标记坐标 系统,以便所有标记的z坐标均为0(请参见代码示例中的Out [4])。首先,我 没有这一步就尝试了它,但是我读了很多教程, 似乎校准以某种方式假定了这一点,但我不确定。请纠正我的错误。
  2. 我使用solvePnP来获取rvectvec
  3. 我申请cv2.Rogrigues(rvec)以获得rotationMatrix
  4. 然后,相机在标记坐标中的位置由camPos = -np.matrix(rotationMatrix).T * np.matrix(tvec)
  5. 计算

在那之后,我比较了imu和估计的相机位置之间的距离,结果最终约为1m,但不一致。这些是5张样本图片的结果。

array([[0.65556006],
       [1.19668318],
       [1.37138227],
       [0.64020471],
       [0.55105675]])

但是,imu和相机之间的距离应该恰好是2.4m(手动测量),并且不要改变(因为两者都固定在汽车的顶部)。

solvePnP是否可能输出错误结果,或者我在过程中的其他地方犯了错误?

类似的问题,但没有答案将是this

0 个答案:

没有答案