カメラ、imu、GPS を搭載した車があります。カメラは運転中に写真を撮ります。写真と GPS 座標が同期されます。今、私は写真からカメラのポーズを取得しようとしています (imu に関連する) がsolvePnP
、期待される結果と同様の外部カメラ キャリブレーションにはなりません。
詳細については、OpenCV 4.0.0 で Python (3.6.8) を使用しています。
私が知っている次のデータ:
- 8 つのマーカーと、世界座標での正確な位置があります。
- ワールド座標でイムの軌跡を持っています。
- いくつかの写真(6576 x 4384 px)のマーカーのピクセル座標があります。
- 固有のカメラ キャリブレーションがあります。
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])
現在、私のプロセスは次のもので構成されています。
- すべてのマーカーの z 座標が 0 になるように、すべてのワールド座標をローカル マーカー座標系に変換します (コード例の Out[4] を参照)。最初はこの手順なしで試してみましたが、チュートリアルをたくさん読んだところ、キャリブレーションが何らかの形でこれを想定しているように見えましたが、よくわかりません。私が間違っている場合は、私を修正してください。
- 私は と を取得するために使用し
solvePnP
ます。rvec
tvec
- を取得するために申請
cv2.Rogrigues(rvec)
しますrotationMatrix
- 次に、マーカー座標でのカメラ位置は次のように計算されます。
camPos = -np.matrix(rotationMatrix).T * np.matrix(tvec)
その後、imu と推定カメラ位置の距離を比較すると、約 1m になりましたが、一貫していません。これらは、5 つのサンプル画像の結果です。
array([[0.65556006],
[1.19668318],
[1.37138227],
[0.64020471],
[0.55105675]])
ただし、imu とカメラの間の距離は、かなり正確に 2.4 m (手動で測定) であり、まったく変化しないはずです (両方とも車の上部に固定されているため)。
solvePnP が間違った結果を出力する可能性はありますか、それともプロセスのどこかで間違いを犯している可能性はありますか?
同様の質問ですが、答えはありませんthis .