簡體   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