Skip to content

Instantly share code, notes, and snippets.

@YoshiRi
Created August 31, 2017 22:45
Show Gist options
  • Save YoshiRi/8e4334104fb9e13673f40c870f681e7c to your computer and use it in GitHub Desktop.
Save YoshiRi/8e4334104fb9e13673f40c870f681e7c to your computer and use it in GitHub Desktop.
get rectified image and put disparity image
// 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