在立体声校准中,如果我改变立体相机的分辨率,外在矩阵如何变化

时间:2017-07-20 12:43:56

标签: c++ opencv matrix stereoscopy

我的立体相机具有不同的分辨率1280x480,640x240和320x120。 (相机流水平粘贴的同步图像对640X480,这就是为什么是1280x480)。

我在以下link中使用了Opencv3立体声校准算法来校准分辨率为1280 * 480的立体相机。

    stereoRectify( M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, img_size, &roi1, &roi2 );
    Mat map11, map12, map21, map22;
    initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12);
    initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22);

    Mat img1r, img2r;
    remap(img1, img1r, map11, map12, INTER_LINEAR);
    remap(img2, img2r, map21, map22, INTER_LINEAR);

stereoRectify 计算左右相机之间的旋转矩阵R,平移矩阵T.并且,它计算两个旋转矩阵R1,R2和两个投影P1 P2的矩阵。我使用 stereoRectify 的输出作为 initUndistortRectifyMap 的输入,然后重新映射以应用投影。

以下是解释如何操作的stackoverflow答案。

现在我有左边map11,map12和右边相机map21,map22的整理地图的两个矩阵。

但是现在我想使用这些相机矩阵M1和M2,失真矩阵D1和D2,以及外部矩阵R,T,R1,R2,P1和P2来分别以较低分辨率(320x120)校正相机图像。 PS我没有直接校准分辨率为320 * 120的相机,因为图像太小而Opencv的算法无法找到棋盘角来执行校准。

我知道“失真系数不依赖于观看的场景。因此,它们也属于固有的摄像机参数。无论捕获的图像分辨率如何,它们都保持不变。例如,如果摄像机已经在320 x 240分辨率的图像上校准,绝对相同的失真系数可用于来自同一相机的640 x 480图像,而f_x,f_y,c_x和c_y需要适当缩放。 根据{{​​3}}。 (我测试过它正在运行)

我想知道:我应该如何修改R,T,R1,R2,P1,P2的矩阵,以1280x480到320x120的较低分辨率进行重映射?

2 个答案:

答案 0 :(得分:1)

实际上 我改变了P1和P2的矩阵,它们是相机内部矩阵和相机平移矩阵的组合。

我使用320x120将它们除以4。通用公式为:

FX' =(dimx' / dimx)* fx

FY' =(dimy' / dimy)* fy

FX'是您的新分辨率的值,fx是您原始分辨率已有的值,dimx'是沿x轴的新分辨率,dimx是原始分辨率。这同样适用于fy。

cx和cy是类比计算的,因为所有这些值都以像素坐标表示。

答案 1 :(得分:-1)

在玩了很多后,不仅 P1P2应该缩放,还要M1M2(在OP的代码中)

请记住,缩放只是左缩放矩阵的两个第一对角线条目,并将第三个保留为1。

相关问题