我最初發布這個在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. ]
感謝您的閱讀,我會誠實地欣賞任何建議,在這一點上...
我被禁止發佈超過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
問:你會得到滿意的點雲相機座標框?如果是這樣,你可以使用點灰度校準文件來獲得你想要的(沒有用棋盤校準)。校正後的圖像沒有鏡頭失真,因此如果給定視差值,將其轉換爲深度(z = Bf/d),然後使用已知焦距f將其投影到相機座標。 – killogre