繁体   English   中英

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

[英]How to rectify a stereo image pair using 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);
}

我希望这两个图像都可以修正,如立体声录制的文档所示。

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

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

有指导在互联网上进行立体声校准。 其中很少有人列在这里。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM