2013-10-06 44 views
9

我最初發布這個在OpenCV的論壇,但不幸的是,我並沒有得到太多的意見/答覆,所以我在這裏張貼與希望,有人可能有一個方向請建議?OpenCV的立體匹配/校準

我現在用的是大黃蜂XB3立體相機,它有3個鏡頭。我花了大約三個星期的時間閱讀論壇,教程,學習OpenCV書以及使用立體聲校準和立體匹配功能的實際OpenCV文檔。總之,我的問題是,我生成了很好的視差圖,但非常差的點雲,看起來偏斜/凹陷,並且不代表實際場景。

我迄今所做的:

使用OpenCV的stereo_calibration和stereo_matching例子:

利用棋盤的圖像

1)原材料場景圖像校準我的立體相機:http://answers.opencv.org/upfiles/1380850337241986.jpg
2)整理相機校準後使用矩陣從相機獲得的原始圖像
http://answers.opencv.org/upfiles/13808502665723237.png
3)生成使用立體匹配(SGBM)
整流圖像的視差圖像: 4)預計這些差距的三維點雲

我已對迄今所做的消除我的問題:

  • 我已經嘗試了第一和第二的圖像,然後第二和第三鏡頭和 終於第1和第2位。我的棋盤的
  • 我已經重新運行校準捕獲通過改變 距離(接近/遠離)
  • 我已經使用了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矩陣,從而明顯地跳出某些東西。這相較於學習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. ] 

感謝您的閱讀,我會誠實地欣賞任何建議,在這一點上...

+0

我被禁止發佈超過2個鏈接。所以這些是剩餘的: 3)使用立體匹配(SGBM)從矯正圖像生成差異圖像:http://answers.opencv.org/upfiles/13808503551344959.png 4)將這些差異預測爲3D點雲:http://answers.opencv.org/upfiles/13808503649376151.png 和:http://answers.opencv.org/upfiles/13808503782809438.png – BumblebeeUser89

+0

問:你會得到滿意的點雲相機座標框?如果是這樣,你可以使用點灰度校準文件來獲得你想要的(沒有用棋盤校準)。校正後的圖像沒有鏡頭失真,因此如果給定視差值,將其轉換爲深度(z = Bf/d),然後使用已知焦距f將其投影到相機座標。 – killogre

回答

0

使用OpenCV(v.2.4.6)3D重建函數時,發現了類似的問題。 有些人,比如馬丁·佩里斯,已經自己實施了。 http://blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

不幸的是,有時候我在使用我的數據的兩個實現中發現了問題。 所以,我認爲我在這些情況下的問題是由於一個糟糕的外部攝像頭參數描述。也許,這也是你的情況。 : - ?

PS。爲了擺脫背景,您需要對其進行細分。或者,至少,一旦重建工作,檢查大於閾值的深度值。 handleMissingValues標誌僅消除「無限」 PS2處的點。請告訴我們,如果你解決這個問題。我認爲這對所有的社區都很有價值。 Thnx

+0

鏈接已死,但互聯網存檔。 –