我正在嘗試使用StereoBM來獲取兩幅圖像的視差圖。我嘗試了一些示例代碼和圖像。他們工作正常。但是,當我嘗試自己的圖像時,地圖非常糟糕,非常嘈雜。差使用opencv的視差圖StereoBM
我StereoBM參數
sbm.state->SADWindowSize = 25;
sbm.state->numberOfDisparities = 128;
sbm.state->preFilterSize = 5;
sbm.state->preFilterCap = 61;
sbm.state->minDisparity = -39;
sbm.state->textureThreshold = 507;
sbm.state->uniquenessRatio = 0;
sbm.state->speckleWindowSize = 0;
sbm.state->speckleRange = 8;
sbm.state->disp12MaxDiff = 1;
我的問題是
- 有關我的圖像的任何問題?
- 如果沒有攝像頭校準,是否可以獲得很好的視差圖?我是否需要在立體聲之前糾正圖像
謝謝。
這裏是我糾正圖像
Mat img_1 = imread("image1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat img_2 = imread("image2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
int minHessian = 430;
SurfFeatureDetector detector(minHessian);
std::vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect(img_1, keypoints_1);
detector.detect(img_2, keypoints_2);
//-- Step 2: Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor;
Mat descriptors_1, descriptors_2;
extractor.compute(img_1, keypoints_1, descriptors_1);
extractor.compute(img_2, keypoints_2, descriptors_2);
//-- Step 3: Matching descriptor vectors with a brute force matcher
BFMatcher matcher(NORM_L1, true); //BFMatcher matcher(NORM_L2);
std::vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for(int i = 0; i < matches.size(); i++)
{ double dist = matches[i].distance;
if(dist < min_dist) min_dist = dist;
if(dist > max_dist) max_dist = dist;
}
std::vector<DMatch> good_matches;
vector<Point2f>imgpts1,imgpts2;
for(int i = 0; i < matches.size(); i++)
{
if(matches[i].distance <= max(4.5*min_dist, 0.02)){
good_matches.push_back(matches[i]);
imgpts1.push_back(keypoints_1[matches[i].queryIdx].pt);
imgpts2.push_back(keypoints_2[matches[i].trainIdx].pt);
}
}
std::vector<uchar> status;
cv::Mat F = cv::findFundamentalMat(imgpts1, imgpts2, cv::FM_8POINT, 3., 0.99, status); //FM_RANSAC
Mat H1,H2;
cv::stereoRectifyUncalibrated(imgpts1, imgpts1, F, img_1.size(), H1, H2);
cv::Mat rectified1(img_1.size(), img_1.type());
cv::warpPerspective(img_1, rectified1, H1, img_1.size());
cv::Mat rectified2(img_2.size(), img_2.type());
cv::warpPerspective(img_2, rectified2, H2, img_2.size());
StereoBM sbm;
sbm.state->SADWindowSize = 25;
sbm.state->numberOfDisparities = 128;
sbm.state->preFilterSize = 5;
sbm.state->preFilterCap = 61;
sbm.state->minDisparity = -39;
sbm.state->textureThreshold = 507;
sbm.state->uniquenessRatio = 0;
sbm.state->speckleWindowSize = 0;
sbm.state->speckleRange = 8;
sbm.state->disp12MaxDiff = 1;
Mat disp,disp8;
sbm(rectified1, rectified2, disp);
整流圖像和視差圖碼在這裏
是的,他們需要被糾正,你可以在[文檔]閱讀(http://docs.opencv.org/2.4/modules/calib3d/ doc/camera_calibration_and_3d_reconstruction.html#stereobm-operator) – Berriel
@Berriel可以在沒有任何相機信息的情況下糾正圖像?對不起,我是新手。我讀了stereo_match.cpp。它需要相機的內在參數。 – fnhdx