Matrix 如何从里程计/tf数据中获取投影矩阵?

Matrix 如何从里程计/tf数据中获取投影矩阵?,matrix,camera,dataset,ros,projection-matrix,Matrix,Camera,Dataset,Ros,Projection Matrix,我想将我的视觉里程测量结果与KITTI数据集提供的地面真相进行比较。 对于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个

我想将我的视觉里程测量结果与KITTI数据集提供的地面真相进行比较。 对于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 变换矩阵。矩阵 以行对齐顺序存储( 第一个条目对应于第一个条目 行),并在i'th中取一分 坐标系并将其投影到 第一个(=0)坐标系。 因此,平移部分(3x1 第4)列的向量对应于 左侧摄影机坐标的姿势 第i帧中的系统 到第一(=0)帧

但我不知道如何为我生成相同类型的数据。 我的案例中每一帧的内容:

  • 从init_摄像机(从(0,0,0)到正在移动的左摄像机的Tf变换。我有平移向量和四元数旋转
  • 里程计数据:姿势和扭曲
  • 摄像机标定参数
有了这些数据,我如何与事实相比较?所以我需要从上面的数据中找到投影矩阵,但我不知道怎么做

在一幅大图中,我想获得一个投影矩阵,或者知道如何分解由地面真相提供的投影矩阵,以便将转换与我的数据进行比较

有人能帮我吗


谢谢

我对计算机视觉不是很实用,但请看一看并参考一下

应该是这样的:

void imageCallback([…],常数传感器\u msgs::Cameranforoconstr&info\u msg){
//使用传感器msgs::Cameranfo初始化cam_模型
图像几何:针孔几何模型cam模型;
来自Cameranfo(信息信息)的凸轮模型;
//得到投影矩阵
cv::Matx34d投影矩阵;
投影矩阵=cam模型投影矩阵();
}

您确定要使用投影矩阵吗?相机投影矩阵通常为3x4矩阵,将图像平面中R3中的(同质)点投影到R2中的(同质)点,并达到一定比例(请参见)。听起来你对比较你的计算视觉里程计和KITTI网站上提供的地面真实里程计感兴趣;在本例中,您将比较VO估计中的刚性变换矩阵与KITTI地面真值变换

如果您使用的是“原始”数据集,“地面真相”将作为OXTS数据记录提供,即IMU和GPS组合数据。此数据位于全局框架中,与您的数据相比需要做更多的工作。但是,听起来您使用的是里程计基准数据;地面真相转换已经在左摄像机的框架中,这将使任务变得更容易(这就是我将要讨论的)

因为您没有指定语言,我这里会更一般地说,但是ROS确实提供C++(TF和EGEN)和Python(Trime.Py)中的工具来执行任务,例如从四元数转换为旋转矩阵……/P> 您有

t
q
,平移和旋转表示为四元数。可以将四元数转换为旋转矩阵(通常为“sxyz”形式),反之亦然。KITTI数据指定为3x4矩阵,这是与平移向量连接的旋转矩阵(即第4列为tgt)

r11 r12 r13 t1
r21 r22 r23 t2
r31 r32 r33 t3

您可以通过计算L2范数来简单地计算转换错误:| | t-tgt | |。计算旋转中的误差有点困难;一种方法是使用来自Eigen的函数,例如
QuaternionBase::angularDistance()
,因为两个测量值应该在同一坐标系中。为此,需要使用Eigen或transformations.py库将地面真值旋转矩阵转换为四元数

请记住,这是里程计帧中的错误-即,相对于初始姿势帧中的第i个地面真实姿势,您的第i个估计姿势的错误。有时,比较帧与帧之间的平均误差也很有用,特别是因为里程计往往随时间显著漂移,即使算法在平均帧之间相对准确

总之:

  • 将旋转矩阵转换为四元数以计算角度误差(注意坐标系)
  • 并使用公式| | t-tgt | |计算平移误差
  • 再次注意你的坐标系

是的,我见过这个功能。我没有测试它,因为在我看来,如果我错了,请纠正我,在这种情况下,投影总是相同的不是吗?因为我的意思是,由于相机的配置,每一帧的相机信息都是相同的。在每一帧中,我假设有一个不同的投影矩阵。可以测试。谢谢,因为在我的相机信息中,由于相机的参数,我已经有了投影矩阵。很抱歉,正如我告诉你的,我不太实际(这只是一个“长评论”作为清晰的答案)。等待其他答案或试着继续提问。不,无论如何谢谢Alex的回答=)。谢谢@grumpy_robot给我这个好答案。现在我的脑子里有点清楚了。所以,如果我做得好,我不需要把我的里程计结果转换成投影矩阵?只需要将基本事实转化为旋转和平移,这样我就可以计算两者的误差了?事实上,我之所以想要投影矩阵,是因为它们在CPP中提供了一个工具,可以使用groundtruth进行评估,并且它们在自述文件中告诉我“您的提交结果必须使用相同的数据格式。”我不太理解