如何使用opencv校正立体声图像对?

时间:2019-04-20 18:57:45

标签: c++ opencv

我已经设置了两个摄像机并分别进行了校准,之后我使用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所示那样得到校正。

但是,事实并非如此。两张图片之间存在明显的垂直差异。 我想念什么?

1 个答案:

答案 0 :(得分:0)

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

有一些在互联网上进行立体声校准的指南。这里很少列出。

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