【问题标题】:How to rectify a stereo image pair using opencv?如何使用 opencv 校正立体图像对?
【发布时间】:2019-04-29 23:49:44
【问题描述】:

我已经设置了两个相机并分别校准它们,之后我使用stereoCalibrate 函数校准了它们。校准似乎工作正常,因为所有返回的重投影误差都在 0.4 到 0.5 的范围内。现在我想从立体图像对中计算出深度图。就我可以遵循的教程而言,我首先需要纠正我的图像,对它们进行灰度化并将它们传递给 StereoBM(或任何其他匹配器)。

据我了解,下面的代码应该纠正并显示两个摄像头的实时图像。

... Load calibration matrices

//compute rectification
Mat R1, R2, P1, P2, Q;
stereoRectify(cameraMatrix_left, distortionCoefficients_left,
   cameraMatrix_right, distortionCoefficients_right,
   Size(left_camera.get(CAP_PROP_FRAME_WIDTH),
   left_camera.get(CAP_PROP_FRAME_HEIGHT)),
   R, T, R1, R2, P1, P2, Q, 0, 0.0,
   Size(left_camera.get(CAP_PROP_FRAME_WIDTH),
   left_camera.get(CAP_PROP_FRAME_HEIGHT)));

//compute undistortion
Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix_left, distortionCoefficients_left, R1, P1, Size(left_camera.get(CAP_PROP_FRAME_WIDTH), left_camera.get(CAP_PROP_FRAME_HEIGHT)), CV_16SC2, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cameraMatrix_right, distortionCoefficients_right, R2, P2, Size(right_camera.get(CAP_PROP_FRAME_WIDTH), right_camera.get(CAP_PROP_FRAME_HEIGHT)), CV_16SC2, rmap[1][0], rmap[1][1]);

while (true) {
    if (!right_camera.read(capturedFrame_right))
        break;
    if (!left_camera.read(capturedFrame_left))
        break;

    remap(capturedFrame_left, drawFrame_left, rmap[0][0], rmap[0][1], INTER_LINEAR, BORDER_DEFAULT, Scalar());
    remap(capturedFrame_right, drawFrame_right, rmap[1][0], rmap[1][1], INTER_LINEAR, BORDER_DEFAULT, Scalar());

    cvtColor(drawFrame_left, grayScale_left, COLOR_RGB2GRAY);
    cvtColor(drawFrame_right, grayScale_right, COLOR_RGB2GRAY);

    imshow(RIGHT_CAMERA, grayScale_right);
    imshow(LEFT_CAMERA, grayScale_left);
}

我希望两个图像都得到纠正,如 the documentation of stereoRectify 所示。

但是,它们根本不是。两张图片之间存在明显的垂直差异。 我错过了什么?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    您需要检查您的校准是否正确。为该相机加载了正确的校准矩阵,它应该提供带有上述代码的校正图像。

    互联网上有关于进行立体校准的指南。这里列出的很少。

    1. 校准图案与相机之间的具体距离并不重要。 必须以固定焦点执行校准。
    2. 具有更多方格的棋盘是有益的,因为要提取更多角点。这使我们能够获得更多的 3D-2D 点对应关系(正方形的大小不应该产生影响)。
    3. 需要不同的观点和角度。标定通过最小二乘法检测焦距和畸变参数,需要不同角度的棋盘格才能获得更好的解。
    4. 校准图案周围需要足够宽的边框。
    5. 较大的图案更适合基线较大的相机,因为立体重叠较少。
    6. 某些校准工具箱要求输入的棋盘尺寸为奇数 x 偶数(例如 9x6)或反之亦然(例如 8x7)。
    7. 棋盘最好至少覆盖图像区域的一半。
    8. 必须移动校准图案以覆盖相机的整个 FOV 以获得更好的校准。倾斜有助于确定焦距,将棋盘移向角落有助于确定失真 co 系数。
    9. 良好的照明条件是最重要的,但经常被忽视。
    10. 一些消息来源说,圆形比角点更容易定位,使用圆形图案可能会带来更好的校准。
    11. 湿度变化可能会影响使用的普通纸张,因为它会吸收水分。必须使用厚纸,校准图案必须使用激光打印机打印,并且最好贴在玻璃背板上。

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2023-03-08
      相关资源
      最近更新 更多