关于EuRoc数据集双目相机之间的基线长度

EUROC数据集提供了双目和IMU数据,可是并没有找到关于双目相机基线长度的直接描述。

查看了一番关于该数据集的论文publisher,设备描述部分并没有关于这一点的细节。

不过数据集中提供了sensor.yaml文件,该文件中,有这个sensor关于Body的T_BS(齐次坐标形式的4×4矩阵,可以参考高博的书籍或者博客)。

根据坐标转换关系:

T_C1C2=T_C1B * T_BC2,写两行代码应该可以算一下。

#include <iostream>
using namespace std;
#include <Eigen/Core>
#include <Eigen/Dense>

int main()
{
  Eigen::Matrix4d T_BC1;
  Eigen::Matrix4d T_BC2;
  T_BC1<<0.0148655429818, -0.999880929698, 0.00414029679422, -0.0216401454975,
	0.999557249008, 0.0149672133247, 0.025715529948, -0.064676986768,
	-0.0257744366974, 0.00375618835797, 0.999660727178, 0.00981073058949,
	0.0, 0.0, 0.0, 1.0;
  T_BC2<<0.0125552670891, -0.999755099723, 0.0182237714554, -0.0198435579556,
	0.999598781151, 0.0130119051815, 0.0251588363115, 0.0453689425024,
	-0.0253898008918, 0.0179005838253, 0.999517347078, 0.00786212447038,
	0.0, 0.0, 0.0, 1.0;
  cout.precision(15);
  cout<<"T_BC1"<<endl<<T_BC1<<endl;
  cout<<"T_BC2"<<endl<<T_BC2<<endl;

  Eigen::Matrix4d T_C1C2 = Eigen::Matrix4d::Zero();
  T_C1C2 = T_BC2.inverse()*T_BC1;
  
  cout<<"T_C1C2"<<endl<<T_C1C2<<endl;  
  return 0;
}

T_BC1和T_BC2的数据来自cam0和cam1文件夹中的sensor.yaml文件。

输出结果如下:

T_BC1
0.0148655429818 -0.999880929698 0.00414029679422 -0.0216401454975
0.999557249008 0.0149672133247 0.025715529948 -0.064676986768
-0.0257744366974 0.00375618835797 0.999660727178 0.00981073058949
         0          0          0          1
T_BC2
0.0125552670891 -0.999755099723 0.0182237714554 -0.0198435579556
0.999598781151 0.0130119051815 0.0251588363115 0.0453689425024
-0.0253898008918 0.0179005838253 0.999517347078 0.00786212447038
         0          0          0          1
T_C1C2
0.999997256477881 0.00231206719242389 0.00037600810241559 -0.110073808127187
-0.00231713572328124 0.999898048506644 0.0140898358466482 0.000399121547014141
-0.000343393120524168 -0.0140906684527146 0.999900662637728 -0.000853702503358044
           0            0            0            1
可以看出来,T_C1C2的 t向量部分(代表平移),只有第一个值不是0(近似)。R矩阵部分近似单位阵也证明两个cam之间没有旋转。

姑且认为这个

0.110073808127187

就是基线的长度,单位:米。(无人机上装载的传感器,10厘米左右的基线貌似也挺合理)

如果哪位看官发现了数据集官方有对基线长度的直接描述,欢迎交流,指正!



  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在OpenCV中,可以通过 `cv::stereoCalibrate()` 函数来求解双目相机基线(baseline)。 该函数需要输入一组双目图像对,以及相应的相机内部参数和外部参数等信息。可以通过调用 `cv::calibrateCamera()` 函数得到相机的内部参数和外部参数。具体使用方法可以参考OpenCV官方文档。 在得到相机内部参数、外部参数和双目图像对之后,可以调用 `cv::stereoCalibrate()` 函数求解基线。该函数会返回两个值,分别为左右相机的投影矩阵(projection matrix)。 其中,左相机的投影矩阵为 [I|0],右相机的投影矩阵为 [R|t],其中 R 和 t 分别表示左相机到右相机的旋转矩阵和平移矩阵,可以通过该矩阵计算出基线长度。 具体实现可以参考以下代码: ``` // 定义左右相机的投影矩阵 cv::Mat P1, P2; // 定义左右相机的旋转矩阵和平移矩阵 cv::Mat R, t; // 定义基础矩阵和本质矩阵 cv::Mat F, E; // 标定左右相机,获取相机内部参数和外部参数 // ... // 求解基础矩阵和本质矩阵 cv::stereoCalibrate(objectPoints, imagePoints1, imagePoints2, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageSize, R, t, E, F); // 根据左右相机的投影矩阵计算基线长度 double baseline = cv::norm(t); ``` 以上代码中,`objectPoints` 为标定板上每个角点的世界坐标,`imagePoints1` 和 `imagePoints2` 分别为左右相机对应的角点图像坐标,`cameraMatrix1` 和 `cameraMatrix2` 分别为左右相机的内部参数矩阵,`distCoeffs1` 和 `distCoeffs2` 分别为左右相机的畸变系数,`imageSize` 为图像尺寸。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值