gaoxiang12 / slambook2

edition 2 of the slambook
MIT License
5.52k stars 2.02k forks source link

请教ch13(设计SLAM系统)中src/dataset.cpp中的代码含义 #213

Open LiKangyuLKY opened 2 years ago

LiKangyuLKY commented 2 years ago

想要请教的代码片段如下:

for (int i = 0; i < 4; ++i) {
        char camera_name[3];
        for (int k = 0; k < 3; ++k) {
            fin >> camera_name[k];
        }
        double projection_data[12];
        for (int k = 0; k < 12; ++k) {
            fin >> projection_data[k];
        }
        Mat33 K;
        K << projection_data[0], projection_data[1], projection_data[2],
            projection_data[4], projection_data[5], projection_data[6],
            projection_data[8], projection_data[9], projection_data[10];
        Vec3 t;
        t << projection_data[3], projection_data[7], projection_data[11];
        t = K.inverse() * t;
        K = K * 0.5;
        Camera::Ptr new_camera(new Camera(K(0, 0), K(1, 1), K(0, 2), K(1, 2),
                                          t.norm(), SE3(SO3(), t)));
        cameras_.push_back(new_camera);
        LOG(INFO) << "Camera " << i << " extrinsics: " << t.transpose();
    }

这一部分代码从KITTI数据集的calib.txt中读取相机的配置参数,定义了投影矩阵projection_data[12]来读取。 请问这里记录的投影矩阵和相机的内外参之间有什么关系呢,为什么要用下面这两行代码来计算t和K?

t = K.inverse() * t;
K = K * 0.5;

最后在LOG里记录的INFO应该是相机的外参吧,怎么是用t的转置?用的为啥不是R | t呢?

warden2018 commented 2 years ago

求这个数据集的具体链接

MarkShawn2020 commented 2 years ago

大佬这个问题解决了吗?最近刚入门,也在琢磨这个问题,我的困惑点和您一模一样

CnybTseng commented 2 years ago

K = K * 0.5是因为输入图像缩放为原图的一半,所以内参也要缩放为原来的一半