Created
August 31, 2017 22:45
-
-
Save YoshiRi/8e4334104fb9e13673f40c870f681e7c to your computer and use it in GitHub Desktop.
get rectified image and put disparity image
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// for image processing | |
#include "opencv2/calib3d/calib3d.hpp" | |
#include "opencv2/imgproc.hpp" | |
#include "opencv2/imgcodecs.hpp" | |
#include "opencv2/highgui.hpp" | |
#include "opencv2/core/utility.hpp" | |
#include "opencv2/ximgproc/disparity_filter.hpp" | |
#include <stdio.h> | |
#include <stdlib.h> | |
cv::Rect computeROI(cv::Size2i src_sz, cv::Ptr<cv::StereoMatcher> matcher_instance) | |
{ | |
using namespace cv; | |
using namespace cv::ximgproc; | |
int min_disparity = matcher_instance->getMinDisparity(); | |
int num_disparities = matcher_instance->getNumDisparities(); | |
int block_size = matcher_instance->getBlockSize(); | |
int bs2 = block_size/2; | |
int minD = min_disparity, maxD = min_disparity + num_disparities - 1; | |
int xmin = maxD + bs2; | |
int xmax = src_sz.width + minD - bs2; | |
int ymin = bs2; | |
int ymax = src_sz.height - bs2; | |
Rect r(xmin, ymin, xmax - xmin, ymax - ymin); | |
return r; | |
} | |
void show_stereo(const cv::Mat imgLeft,const cv::Mat imgRight){ | |
using namespace cv; | |
using namespace cv::ximgproc; | |
Mat imgDisparity16S = Mat( imgLeft.rows, imgLeft.cols, CV_16S ); | |
Mat imgDisparity8U = Mat( imgLeft.rows, imgLeft.cols, CV_8UC1 ); | |
Mat filtered_disp; | |
//-- 2. Call the constructor for StereoBM | |
int ndisparities = 16*5; /**< Range of disparity */ | |
int SADWindowSize = 21; /**< Size of the block window. Must be odd */ | |
Ptr<StereoBM> sbm = StereoBM::create( ndisparities, SADWindowSize ); | |
sbm->setTextureThreshold(0); | |
sbm->setUniquenessRatio(0); | |
Rect ROI = computeROI(imgLeft.size(),sbm); | |
// define filter | |
Ptr<DisparityWLSFilter> wls_filter; | |
wls_filter = createDisparityWLSFilterGeneric(false); | |
wls_filter->setDepthDiscontinuityRadius((int)ceil(0.33*SADWindowSize)); | |
//-- 3. Calculate the disparity image | |
sbm->compute( imgLeft, imgRight, imgDisparity16S ); | |
// Post Filtering | |
double lambda,sigma; | |
lambda = 8000.0; | |
sigma = 1.5; | |
wls_filter->setLambda(lambda); | |
wls_filter->setSigmaColor(sigma); | |
wls_filter->filter(imgDisparity16S,imgLeft,filtered_disp,Mat(),ROI); | |
//-- Check its extreme values | |
double minVal; double maxVal; | |
minMaxLoc( filtered_disp, &minVal, &maxVal ); | |
//-- 4. Display it as a CV_8UC1 image | |
filtered_disp.convertTo( imgDisparity8U, CV_8UC1, 255/(maxVal - minVal)); | |
namedWindow( "Disparity", WINDOW_NORMAL ); | |
imshow( "Disparity", imgDisparity8U ); | |
waitKey(1); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment