我目前正在试验 Kitti 立体数据集(http://www.cvlibs.net/datasets/kitti/eval_odometry.php),目标是找到一个正确的矩阵,将像素投影到世界坐标系中的点。问题是我不确定 Kitti 数据集中使用的是哪个坐标系。自述文件说:
每个文件 xx.txt 包含一个 N x 12 表,其中 N 是该序列的帧数。第 i 行通过 3x4 变换矩阵表示左相机坐标系的第 i 个姿势(即,z 指向前方)。矩阵以行对齐的顺序存储(第一个条目对应于第一行),并在第 i 个坐标系中取一个点并将其投影到第一个 (=0th) 坐标系中。因此,平移部分(第 4 列的 3x1 向量)对应于第 i 帧中左侧相机坐标系相对于第一(=第 0)帧的位姿。
所以据我所知,这个矩阵代表一个世界到相机的映射,因此我应该把它的逆从相机 cs 投影到世界 cs?
另一个问题是我需要以不同的方式定位世界坐标系:-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.