首页 文章

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

提问于
浏览
2

我的立体相机有不同的分辨率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的算法无法找到棋盘角来执行校准 .

我知道"The distortion coefficients do not depend on the scene viewed. Thus, they also belong to the intrinsic camera parameters. And they remain the same regardless of the captured image resolution. If, for example, a camera has been calibrated on images of 320 x 240 resolution, absolutely the same distortion coefficients can be used for 640 x 480 images from the same camera while f_x, f_y, c_x, and c_y need to be scaled appropriately."根据the documentation of opencv . (我测试过它正在工作)

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

2 回答

  • -1

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

    我使用320x120将它们除以4 . 通用公式是:

    fx'=(dimx'/ dimx)* fx

    fy'=(dimy'/ dimy)* fy

    fx'是新分辨率的值,fx是原始分辨率的值,dimx'是沿x轴的新分辨率,dimx是原始分辨率 . 这同样适用于fy .

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

  • 0

    经过多次游戏后不仅应该缩放 P1P2 ,还要 M1M2 (在OP的代码中) .

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

相关问题