Path: blob/master/Depth-Perception-Using-Stereo-Camera/cpp/disparity_params_gui.cpp
3142 views
#include <opencv2/opencv.hpp>1#include <opencv2/calib3d/calib3d.hpp>2#include <opencv2/highgui/highgui.hpp>3#include <opencv2/imgproc/imgproc.hpp>4#include <stdio.h>5#include <iostream>6#include "opencv2/imgcodecs.hpp"789// initialize values for StereoSGBM parameters10int numDisparities = 8;11int blockSize = 5;12int preFilterType = 1;13int preFilterSize = 1;14int preFilterCap = 31;15int minDisparity = 0;16int textureThreshold = 10;17int uniquenessRatio = 15;18int speckleRange = 0;19int speckleWindowSize = 0;20int disp12MaxDiff = -1;21int dispType = CV_16S;222324// Creating an object of StereoSGBM algorithm25cv::Ptr<cv::StereoBM> stereo = cv::StereoBM::create();2627cv::Mat imgL;28cv::Mat imgR;29cv::Mat imgL_gray;30cv::Mat imgR_gray;313233// Defining callback functions for the trackbars to update parameter values3435static void on_trackbar1( int, void* )36{37stereo->setNumDisparities(numDisparities*16);38numDisparities = numDisparities*16;39}4041static void on_trackbar2( int, void* )42{43stereo->setBlockSize(blockSize*2+5);44blockSize = blockSize*2+5;45}4647static void on_trackbar3( int, void* )48{49stereo->setPreFilterType(preFilterType);50}5152static void on_trackbar4( int, void* )53{54stereo->setPreFilterSize(preFilterSize*2+5);55preFilterSize = preFilterSize*2+5;56}5758static void on_trackbar5( int, void* )59{60stereo->setPreFilterCap(preFilterCap);61}6263static void on_trackbar6( int, void* )64{65stereo->setTextureThreshold(textureThreshold);66}6768static void on_trackbar7( int, void* )69{70stereo->setUniquenessRatio(uniquenessRatio);71}7273static void on_trackbar8( int, void* )74{75stereo->setSpeckleRange(speckleRange);76}7778static void on_trackbar9( int, void* )79{80stereo->setSpeckleWindowSize(speckleWindowSize*2);81speckleWindowSize = speckleWindowSize*2;82}8384static void on_trackbar10( int, void* )85{86stereo->setDisp12MaxDiff(disp12MaxDiff);87}8889static void on_trackbar11( int, void* )90{91stereo->setMinDisparity(minDisparity);92}939495int main()96{97// Initialize variables to store the maps for stereo rectification98cv::Mat Left_Stereo_Map1, Left_Stereo_Map2;99cv::Mat Right_Stereo_Map1, Right_Stereo_Map2;100101// Reading the mapping values for stereo image rectification102cv::FileStorage cv_file2 = cv::FileStorage("../data/stereo_rectify_maps.xml", cv::FileStorage::READ);103cv_file2["Left_Stereo_Map_x"] >> Left_Stereo_Map1;104cv_file2["Left_Stereo_Map_y"] >> Left_Stereo_Map2;105cv_file2["Right_Stereo_Map_x"] >> Right_Stereo_Map1;106cv_file2["Right_Stereo_Map_y"] >> Right_Stereo_Map2;107cv_file2.release();108109// Check for left and right camera IDs110// These values can change depending on the system111int CamL_id{2}; // Camera ID for left camera112int CamR_id{0}; // Camera ID for right camera113114cv::VideoCapture camL(CamL_id), camR(CamR_id);115116// Check if left camera is attched117if (!camL.isOpened())118{119std::cout << "Could not open camera with index : " << CamL_id << std::endl;120return -1;121}122123// Check if right camera is attached124if (!camL.isOpened())125{126std::cout << "Could not open camera with index : " << CamL_id << std::endl;127return -1;128}129130// Creating a named window that can be linked to the trackbars131cv::namedWindow("disparity",cv::WINDOW_NORMAL);132cv::resizeWindow("disparity",600,600);133134// Creating trackbars to dynamically update the StereoBM parameters135cv::createTrackbar("numDisparities", "disparity", &numDisparities, 18, on_trackbar1);136cv::createTrackbar("blockSize", "disparity", &blockSize, 50, on_trackbar2);137cv::createTrackbar("preFilterType", "disparity", &preFilterType, 1, on_trackbar3);138cv::createTrackbar("preFilterSize", "disparity", &preFilterSize, 25, on_trackbar4);139cv::createTrackbar("preFilterCap", "disparity", &preFilterCap, 62, on_trackbar5);140cv::createTrackbar("textureThreshold", "disparity", &textureThreshold, 100, on_trackbar6);141cv::createTrackbar("uniquenessRatio", "disparity", &uniquenessRatio, 100, on_trackbar7);142cv::createTrackbar("speckleRange", "disparity", &speckleRange, 100, on_trackbar8);143cv::createTrackbar("speckleWindowSize", "disparity", &speckleWindowSize, 25, on_trackbar9);144cv::createTrackbar("disp12MaxDiff", "disparity", &disp12MaxDiff, 25, on_trackbar10);145cv::createTrackbar("minDisparity", "disparity", &minDisparity, 25, on_trackbar11);146147cv::Mat disp, disparity;148149while (true)150{151// Capturing and storing left and right camera images152camL >> imgL;153camR >> imgR;154155// Converting images to grayscale156cv::cvtColor(imgL, imgL_gray, cv::COLOR_BGR2GRAY);157cv::cvtColor(imgR, imgR_gray, cv::COLOR_BGR2GRAY);158159// Initialize matrix for rectified stero images160cv::Mat Left_nice, Right_nice;161162// Applying stereo image rectification on the left image163cv::remap(imgL_gray,164Left_nice,165Left_Stereo_Map1,166Left_Stereo_Map2,167cv::INTER_LANCZOS4,168cv::BORDER_CONSTANT,1690);170171// Applying stereo image rectification on the right image172cv::remap(imgR_gray,173Right_nice,174Right_Stereo_Map1,175Right_Stereo_Map2,176cv::INTER_LANCZOS4,177cv::BORDER_CONSTANT,1780);179180// Calculating disparith using the StereoBM algorithm181stereo->compute(Left_nice,Right_nice,disp);182183// NOTE: compute returns a 16bit signed single channel image,184// CV_16S containing a disparity map scaled by 16. Hence it185// is essential to convert it to CV_32F and scale it down 16 times.186187// Converting disparity values to CV_32F from CV_16S188disp.convertTo(disparity,CV_32F, 1.0);189190// Scaling down the disparity values and normalizing them191disparity = (disparity/16.0f - (float)minDisparity)/((float)numDisparities);192193// Displaying the disparity map194cv::imshow("disparity",disparity);195196// Close window using esc key197if (cv::waitKey(1) == 27) break;198}199200std::cout << "Saving depth estimation paraeters ......";201202cv::FileStorage cv_file = cv::FileStorage("../data/depth_estimation_params_cpp.xml", cv::FileStorage::WRITE);203cv_file.write("numDisparities",numDisparities);204cv_file.write("blockSize",blockSize);205cv_file.write("preFilterType",preFilterType);206cv_file.write("preFilterSize",preFilterSize);207cv_file.write("preFilterCap",preFilterCap);208cv_file.write("textureThreshold",textureThreshold);209cv_file.write("uniquenessRatio",uniquenessRatio);210cv_file.write("speckleRange",speckleRange);211cv_file.write("speckleWindowSize",speckleWindowSize);212cv_file.write("disp12MaxDiff",disp12MaxDiff);213cv_file.write("minDisparity",minDisparity);214cv_file.write("M",39.075);215cv_file.release();216217return 0;218}219220221