簡體   English   中英

OpenCV 立體聲匹配/校准

[英]OpenCV Stereo Matching/Calibration

我最初在 OpenCV 論壇上發布了這個,但不幸的是,我沒有得到太多的意見/回復,所以我在這里發布是希望有人可能有方向建議?

我正在使用 Bumblebee XB3 立體相機,它有 3 個鏡頭。 我花了大約三周時間閱讀有關使用立體校准和立體匹配功能的論壇、教程、Learning OpenCV 書籍和實際的 OpenCV 文檔。 總而言之,我的問題是我生成了一個很好的視差圖,但點雲很差,看起來歪斜/壓扁,不能代表實際場景。

到目前為止我做了什么:

使用 OpenCV 立體校准和立體匹配示例來:

使用棋盤圖像校准我的立體相機

1)原始場景圖片: http : //answers.opencv.org/upfiles/1380850337241986.jpg
2) 使用相機校准后的矩陣校正從相機獲得的原始圖像
http : //answers.opencv.org/upfiles/13808502665723237.png
3)使用立體匹配(SGBM)從校正后的圖像中生成視差圖像
: 4) 將這些差異投影到 3D 點雲

到目前為止,我為消除我的問題所做的工作:

  • 我已經嘗試了第一和第二個圖像,然后是第二個和第三個鏡頭,最后是第一個和第二個。
  • 我通過改變距離(更近/更遠)重新運行了我的棋盤捕獲校准
  • 我使用了 20 多對立體聲進行校准
  • 使用不同的棋盤尺寸:我使用 9x6 棋盤圖像進行校准,現在改用 8x5 棋盤圖像代替
  • 我試過使用塊匹配以及 SGBM 變體並得到
    比較相似的結果。 得到
    到目前為止,SGBM 效果更好。
  • 我改變了視差范圍,改變了 SAD 窗口大小等,但幾乎沒有改進

我懷疑問題是:

我的視差圖像看起來相對可以接受,但下一步是使用 Q 矩陣轉到 3D 點雲。 我懷疑,我沒有正確校准相機以生成正確的 Q 矩陣。 不幸的是,我在思考我還能做些什么來獲得更好的 Q 矩陣方面遇到了困難。 有人可以提出建議嗎?

我認為可能有問題的另一件事是我在使用 cv::stereoCalibrate 函數時所做的假設。 目前,我單獨校准每個相機以獲得相機和失真(cameraMatrix[0]、distCoeffs[0] 和 cameraMatrix[1]、distCoeffs[1])矩陣,因此它使立體校准函數的復雜性更容易一些。

stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
                    cameraMatrix[0], distCoeffs[0],
                    cameraMatrix[1], distCoeffs[1],
                    imageSize, R, T, E, F,
                    TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
                    //CV_CALIB_FIX_ASPECT_RATIO +
                    //CV_CALIB_ZERO_TANGENT_DIST +
                    //CV_CALIB_SAME_FOCAL_LENGTH +
                    CV_CALIB_RATIONAL_MODEL 
                    //CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5
                    );

此外,我認為提及我如何從視差到點雲可能很有用。 我正在使用 OpenCV 的 cv::reprojectImageTo3D,然后將數據寫入 PCL 點雲結構。 這是相關的代碼:

cv::reprojectImageTo3D( imgDisparity16S, reconstructed3D, Q, false, CV_32F);
  for (int i = 0; i < reconstructed3D.rows; i++)
  {
    for (int j = 0; j < reconstructed3D.cols; j++)
    {
        cv::Point3f cvPoint = reconstructed3D.at<cv::Point3f>(i, j);  
            //Filling in a PCL structure
            pcl::PointXYZRGB point;
            point.x = cvPoint.x;
            point.y = cvPoint.y;
            point.z = cvPoint.z;
            point.rgb = rectified_imgRight.at<cv::Vec3b>(i,j)[0]; //Grey information

            point_cloud_ptr->points.push_back (point);
    }
  }

  point_cloud_ptr->width = (int) point_cloud_ptr->points.size();
  point_cloud_ptr->height = 1;
  pcl::io::savePCDFileASCII("OpenCV-PointCloud.pts", *point_cloud_ptr);

PS:之所以選擇上傳這些圖片,是因為場景有些質感,所以期待回復說場景太同質了。 隔板的蓋子和椅子的質感也相當豐富。

幾個問題:

你能幫我刪除似乎是點雲一部分的圖像/視差平面嗎? 為什么會這樣?

有什么明顯的我做錯了嗎? 我會發布我的代碼,但它與提供的 OpenCV 示例非常相似,我認為我沒有做任何更有創意的事情。 如果有可能涉及的特定部分,我可以。

在我天真的看來,視差圖像似乎還可以。 但是點雲絕對不是我從相對不錯的視差圖像中所期望的,它更糟糕。

如果有幫助,我已經提到了我在相機校准后獲得的 Q 矩陣,以防出現明顯的跳躍。 將此與 Learning OpenCV 一書進行比較,我認為沒有任何明顯不正確的地方......

Q: rows: 4
   cols: 4
   data: [ 1., 0., 0., -5.9767076110839844e+002, 0., 1., 0.,
       -5.0785438156127930e+002, 0., 0., 0., 6.8683948509213735e+002, 0.,
       0., -4.4965180874519222e+000, 0. ]

感謝您的閱讀,我會誠實地感謝此時的任何建議......

我在使用 OpenCV (v.2.4.6) 3D 重建功能時發現了類似的問題。 有些人,比如 Martin Peris,自己又實現了。 http://blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

可悲的是,有時我在我的數據的兩種實現中都發現了問題。 所以,我認為我在這些情況下的問題是由於外部相機參數描述不佳。 也許,這也是你的情況。 :-?

附注。 為了擺脫背景,您需要對其進行分割。 或者,至少,一旦重建工作,檢查大於閾值的深度值。 handleMissingValues 標志僅消除“無窮大”PS2 處的點。 請告訴我們您是否解決了這個問題。 我認為它對所有社區都很有價值。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM