現在、Kitti ステレオ データセット ( http://www.cvlibs.net/datasets/kitti/eval_odometry.php )を試しています。目標は、ピクセルを世界座標系の点に投影する正しい行列を見つけることです。問題は、Kitti データセットで使用されている座標系がわからないことです。readme ファイルには次のように書かれています。
各ファイル xx.txt には N x 12 テーブルが含まれています。ここで、N はこのシーケンスのフレーム数です。行 i は、3x4 変換行列を介して左カメラ座標系の i 番目のポーズ (つまり、z が前方を指している) を表します。行列は行に整列された順序で格納され (最初のエントリは最初の行に対応します)、i 番目の座標系でポイントを取得し、最初 (=0 番目) の座標系に投影します。したがって、並進部分 (列 4 の 3x1 ベクトル) は、最初 (=0 番目) のフレームに対する i 番目のフレームの左カメラ座標系のポーズに対応します。
私が理解している限り、この行列は世界からカメラへのマッピングを表しているため、カメラ cs から世界 cs に射影するには、それを逆にする必要がありますか?
もう 1 つの問題は、ワールド座標系を別の方向に向ける必要があることです。-z が前方を指し、y が上を指します。
私のコードの現在のバージョンは次のようになります。
M = np.reshape(M, (3, 4))
#convert local to global c.s. (?)
Rc = M[..., :-1]
tc = M[..., -1]
R, t = Rc.T, -Rc.T.dot(tc.reshape(-1 ))
M[..., :-1] = Rc
M[..., -1] = tc
#convert to CG c.s.
M[0, 1] *= -1.0
M[1, 0] *= -1.0
M[0, 2] *= -1.0
M[2, 0] *= -1.0
M[1, 3] *= -1
M[2, 3] *= -1```
However, when I reproject pixels between consecutive left frames, the resulting pixels end up far beyond image boundaries.
The functions I use for reprojection work correctly, if the coordinates are given in world coordinate system.