我無法從視差中獲取正常的深度圖。 這裏是我的代碼:獲取深度圖
#include "opencv2/core/core.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/contrib/contrib.hpp"
#include <cstdio>
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;
ofstream out("points.txt");
int main()
{
Mat img1, img2;
img1 = imread("images/im7rect.bmp");
img2 = imread("images/im8rect.bmp");
//resize(img1, img1, Size(320, 280));
//resize(img2, img2, Size(320, 280));
Mat g1,g2, disp, disp8;
cvtColor(img1, g1, CV_BGR2GRAY);
cvtColor(img2, g2, CV_BGR2GRAY);
int sadSize = 3;
StereoSGBM sbm;
sbm.SADWindowSize = sadSize;
sbm.numberOfDisparities = 144;//144; 128
sbm.preFilterCap = 10; //63
sbm.minDisparity = 0; //-39; 0
sbm.uniquenessRatio = 10;
sbm.speckleWindowSize = 100;
sbm.speckleRange = 32;
sbm.disp12MaxDiff = 1;
sbm.fullDP = true;
sbm.P1 = sadSize*sadSize*4;
sbm.P2 = sadSize*sadSize*32;
sbm(g1, g2, disp);
normalize(disp, disp8, 0, 255, CV_MINMAX, CV_8U);
Mat dispSGBMscale;
disp.convertTo(dispSGBMscale,CV_32F, 1./16);
imshow("image", img1);
imshow("disparity", disp8);
Mat Q;
FileStorage fs("Q.txt", FileStorage::READ);
fs["Q"] >> Q;
fs.release();
Mat points, points1;
//reprojectImageTo3D(disp, points, Q, true);
reprojectImageTo3D(disp, points, Q, false, CV_32F);
imshow("points", points);
ofstream point_cloud_file;
point_cloud_file.open ("point_cloud.xyz");
for(int i = 0; i < points.rows; i++) {
for(int j = 0; j < points.cols; j++) {
Vec3f point = points.at<Vec3f>(i,j);
if(point[2] < 10) {
point_cloud_file << point[0] << " " << point[1] << " " << point[2]
<< " " << static_cast<unsigned>(img1.at<uchar>(i,j)) << " " << static_cast<unsigned>(img1.at<uchar>(i,j)) << " " << static_cast<unsigned>(img1.at<uchar>(i,j)) << endl;
}
}
}
point_cloud_file.close();
waitKey(0);
return 0;
}
我的圖片:
視差圖:
我得到水木清華這樣的點雲:
Q等於: [1,0,0,-3.2883545303344727e + 02,0,1,0, -2.3697290992736816e + 02,0.1,0.1,0.1, 5.4497170185417110e + 02,0.0,0.,-1.4446083962336606e-02,0]
我嘗試了很多其他的東西。我嘗試了不同的圖像,但沒有人能夠獲得正常的深度圖。
我在做什麼錯?我應該使用reprojectImageTo3D還是使用其他方法來代替它?什麼是深度圖的最佳方式? (我試過了point_cloud庫) 或者你能否給我提供數據集和校準信息的工作示例,我可以運行它並獲取深度圖。或者如何從Middlebury立體聲數據庫(http://vision.middlebury.edu/stereo/data/)獲得depth_map,我認爲沒有足夠的校準信息。
編輯: 現在,我得到水木清華這樣的:
這當然是好,但仍不正常。
Edited2: 我想你說的話:
Mat disp;
disp = imread("disparity-image.pgm", CV_LOAD_IMAGE_GRAYSCALE);
Mat disp64;
disp.convertTo(disp64,CV_64F, 1.0/16.0);
imshow("disp", disp);
我得到這個結果與線CV :: minMaxIdx(...):
這時候我評論這行:
ps:也請你能告訴我怎麼才能計算深度只知道基準線和焦距以像素爲單位。
這一切都取決於您的校準。如果你有超過0.5的重投影錯誤,你會得到一個不好的Q矩陣 – berak
@berak:我知道它,並且因爲我無法獲得良好的校準,所以我嘗試使用來自Internet(https:// code)的數據集。 google.com/p/tjpstereovision/source/browse/),我認爲這是正常的Q矩陣。如何從middleburry數據集獲取深度圖? –