我想将我的视觉测距结果与KITTI数据集提供的groundtruth进行比较。 对于groundthruth中的每个帧,我有一个投影矩阵。 例如:
1.000000e+00 9.043683e-12 2.326809e-11 1.110223e-16 9.043683e-12 1.000000e+00 2.392370e-10 2.220446e-16 2.326810e-11 2.392370e-10 9.999999e-01 -2.220446e-16
以下是自述文件提供的说明:
第i行代表第i个姿势 左相机坐标系(即z 通过3x4指向前方) 变换矩阵。矩阵 以行对齐的顺序存储( 第一个条目对应第一个条目 ()),并在第一点采取一点 坐标系并将其投影到 第一个(= 0)坐标系。 因此,翻译部分(3x1 第4列的向量对应于 左相机坐标的姿势 系统在第i帧中尊重 到第一个(= 0)帧
但我不知道如何为我生成相同类型的数据。 在我的案例中,我对每一帧都有什么:
根据这些数据,我如何与groundtruth比较?所以我需要从上面的数据中找到投影矩阵,但不知道该怎么做。
在大图中,我想获得投影矩阵或知道如何分解由地面实况提供的投影矩阵,以便将变换与我的数据进行比较。
有人可以帮助我吗?
感谢
答案 0 :(得分:2)
您确定要投影矩阵吗? 相机投影矩阵通常是一个3x4矩阵,它将R 3 中的(同质)点投影到图像中R 2 中的(同质)点飞机达到某种程度(参见wikipedia entry)。听起来您有兴趣将您计算的视觉测距与KITTI网站上提供的地面真实测距法进行比较;在这种情况下,您将比较VO估计中的刚性变换矩阵与KITTI地面实况变换。
如果您正在使用“原始”数据集,则提供“地面实况”作为OXTS数据记录 - 即组合的IMU和GPS数据。此数据位于全局框架中,需要更多工作才能与您的数据进行比较。但是,听起来你正在使用里程计基准数据;地面真相变换已经在左相机的框架中,这应该使任务更容易(这就是我将要讨论的)。
由于你没有指定一种语言,我将在这里更广泛地讲,但ROS确实提供了C ++(tf和Eigen)和Python(transformations.py)中的工具来执行诸如从四元数转换为旋转矩阵之类的任务。 ..
您有t
和q
,翻译和轮播表示为四元数。您可以将四元数转换为旋转矩阵(通常为'sxyz'形式),反之亦然。 KITTI数据被指定为3x4矩阵,这是与平移向量连接的旋转矩阵(即第4列是t gt )。
r 11 r 12 r 13 t 1
r 21 r 22 r 23 t 2
r 31 r 32 r 33 t 3
您可以通过计算L2范数简单地计算转换误差:|| t - t gt ||。计算旋转误差有点困难;一种方法是使用来自Eigen的QuaternionBase::angularDistance()
函数,因为两个测量应该在同一坐标系中。为此,您需要使用Eigen或transformations.py库将地面实况旋转矩阵转换为四元数。
请记住,这是里程表框架中的错误 - 即第i个估计姿势相对于初始姿势框架中第i个地面实况姿势的误差。有时,同样地比较帧与帧的平均误差也是有用的,特别是因为即使算法在帧之间平均相对准确,测距也会随着时间的推移而显着漂移。
总结:
答案 1 :(得分:0)
我对计算机视觉不太实用,但请查看sensor_msgs/CameraInfo Message和image_geometry::PinholeCameraModel Class参考。
它应该是这样的:
void imageCallback([...], const sensor_msgs::CameraInfoConstPtr& info_msg) {
// initialize cam_model with sensor_msgs::CameraInfo
image_geometry::PinholeCameraModel cam_model_;
cam_model_.fromCameraInfo(info_msg);
// get the projection matrix
cv::Matx34d projection_matrix;
projection_matrix = cam_model_.projectionMatrix();
}