Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hackassin
GitHub Repository: hackassin/learnopencv
Path: blob/master/Depth-Perception-Using-Stereo-Camera/cpp/disparity_params_gui.cpp
3142 views
1
#include <opencv2/opencv.hpp>
2
#include <opencv2/calib3d/calib3d.hpp>
3
#include <opencv2/highgui/highgui.hpp>
4
#include <opencv2/imgproc/imgproc.hpp>
5
#include <stdio.h>
6
#include <iostream>
7
#include "opencv2/imgcodecs.hpp"
8
9
10
// initialize values for StereoSGBM parameters
11
int numDisparities = 8;
12
int blockSize = 5;
13
int preFilterType = 1;
14
int preFilterSize = 1;
15
int preFilterCap = 31;
16
int minDisparity = 0;
17
int textureThreshold = 10;
18
int uniquenessRatio = 15;
19
int speckleRange = 0;
20
int speckleWindowSize = 0;
21
int disp12MaxDiff = -1;
22
int dispType = CV_16S;
23
24
25
// Creating an object of StereoSGBM algorithm
26
cv::Ptr<cv::StereoBM> stereo = cv::StereoBM::create();
27
28
cv::Mat imgL;
29
cv::Mat imgR;
30
cv::Mat imgL_gray;
31
cv::Mat imgR_gray;
32
33
34
// Defining callback functions for the trackbars to update parameter values
35
36
static void on_trackbar1( int, void* )
37
{
38
stereo->setNumDisparities(numDisparities*16);
39
numDisparities = numDisparities*16;
40
}
41
42
static void on_trackbar2( int, void* )
43
{
44
stereo->setBlockSize(blockSize*2+5);
45
blockSize = blockSize*2+5;
46
}
47
48
static void on_trackbar3( int, void* )
49
{
50
stereo->setPreFilterType(preFilterType);
51
}
52
53
static void on_trackbar4( int, void* )
54
{
55
stereo->setPreFilterSize(preFilterSize*2+5);
56
preFilterSize = preFilterSize*2+5;
57
}
58
59
static void on_trackbar5( int, void* )
60
{
61
stereo->setPreFilterCap(preFilterCap);
62
}
63
64
static void on_trackbar6( int, void* )
65
{
66
stereo->setTextureThreshold(textureThreshold);
67
}
68
69
static void on_trackbar7( int, void* )
70
{
71
stereo->setUniquenessRatio(uniquenessRatio);
72
}
73
74
static void on_trackbar8( int, void* )
75
{
76
stereo->setSpeckleRange(speckleRange);
77
}
78
79
static void on_trackbar9( int, void* )
80
{
81
stereo->setSpeckleWindowSize(speckleWindowSize*2);
82
speckleWindowSize = speckleWindowSize*2;
83
}
84
85
static void on_trackbar10( int, void* )
86
{
87
stereo->setDisp12MaxDiff(disp12MaxDiff);
88
}
89
90
static void on_trackbar11( int, void* )
91
{
92
stereo->setMinDisparity(minDisparity);
93
}
94
95
96
int main()
97
{
98
// Initialize variables to store the maps for stereo rectification
99
cv::Mat Left_Stereo_Map1, Left_Stereo_Map2;
100
cv::Mat Right_Stereo_Map1, Right_Stereo_Map2;
101
102
// Reading the mapping values for stereo image rectification
103
cv::FileStorage cv_file2 = cv::FileStorage("../data/stereo_rectify_maps.xml", cv::FileStorage::READ);
104
cv_file2["Left_Stereo_Map_x"] >> Left_Stereo_Map1;
105
cv_file2["Left_Stereo_Map_y"] >> Left_Stereo_Map2;
106
cv_file2["Right_Stereo_Map_x"] >> Right_Stereo_Map1;
107
cv_file2["Right_Stereo_Map_y"] >> Right_Stereo_Map2;
108
cv_file2.release();
109
110
// Check for left and right camera IDs
111
// These values can change depending on the system
112
int CamL_id{2}; // Camera ID for left camera
113
int CamR_id{0}; // Camera ID for right camera
114
115
cv::VideoCapture camL(CamL_id), camR(CamR_id);
116
117
// Check if left camera is attched
118
if (!camL.isOpened())
119
{
120
std::cout << "Could not open camera with index : " << CamL_id << std::endl;
121
return -1;
122
}
123
124
// Check if right camera is attached
125
if (!camL.isOpened())
126
{
127
std::cout << "Could not open camera with index : " << CamL_id << std::endl;
128
return -1;
129
}
130
131
// Creating a named window that can be linked to the trackbars
132
cv::namedWindow("disparity",cv::WINDOW_NORMAL);
133
cv::resizeWindow("disparity",600,600);
134
135
// Creating trackbars to dynamically update the StereoBM parameters
136
cv::createTrackbar("numDisparities", "disparity", &numDisparities, 18, on_trackbar1);
137
cv::createTrackbar("blockSize", "disparity", &blockSize, 50, on_trackbar2);
138
cv::createTrackbar("preFilterType", "disparity", &preFilterType, 1, on_trackbar3);
139
cv::createTrackbar("preFilterSize", "disparity", &preFilterSize, 25, on_trackbar4);
140
cv::createTrackbar("preFilterCap", "disparity", &preFilterCap, 62, on_trackbar5);
141
cv::createTrackbar("textureThreshold", "disparity", &textureThreshold, 100, on_trackbar6);
142
cv::createTrackbar("uniquenessRatio", "disparity", &uniquenessRatio, 100, on_trackbar7);
143
cv::createTrackbar("speckleRange", "disparity", &speckleRange, 100, on_trackbar8);
144
cv::createTrackbar("speckleWindowSize", "disparity", &speckleWindowSize, 25, on_trackbar9);
145
cv::createTrackbar("disp12MaxDiff", "disparity", &disp12MaxDiff, 25, on_trackbar10);
146
cv::createTrackbar("minDisparity", "disparity", &minDisparity, 25, on_trackbar11);
147
148
cv::Mat disp, disparity;
149
150
while (true)
151
{
152
// Capturing and storing left and right camera images
153
camL >> imgL;
154
camR >> imgR;
155
156
// Converting images to grayscale
157
cv::cvtColor(imgL, imgL_gray, cv::COLOR_BGR2GRAY);
158
cv::cvtColor(imgR, imgR_gray, cv::COLOR_BGR2GRAY);
159
160
// Initialize matrix for rectified stero images
161
cv::Mat Left_nice, Right_nice;
162
163
// Applying stereo image rectification on the left image
164
cv::remap(imgL_gray,
165
Left_nice,
166
Left_Stereo_Map1,
167
Left_Stereo_Map2,
168
cv::INTER_LANCZOS4,
169
cv::BORDER_CONSTANT,
170
0);
171
172
// Applying stereo image rectification on the right image
173
cv::remap(imgR_gray,
174
Right_nice,
175
Right_Stereo_Map1,
176
Right_Stereo_Map2,
177
cv::INTER_LANCZOS4,
178
cv::BORDER_CONSTANT,
179
0);
180
181
// Calculating disparith using the StereoBM algorithm
182
stereo->compute(Left_nice,Right_nice,disp);
183
184
// NOTE: compute returns a 16bit signed single channel image,
185
// CV_16S containing a disparity map scaled by 16. Hence it
186
// is essential to convert it to CV_32F and scale it down 16 times.
187
188
// Converting disparity values to CV_32F from CV_16S
189
disp.convertTo(disparity,CV_32F, 1.0);
190
191
// Scaling down the disparity values and normalizing them
192
disparity = (disparity/16.0f - (float)minDisparity)/((float)numDisparities);
193
194
// Displaying the disparity map
195
cv::imshow("disparity",disparity);
196
197
// Close window using esc key
198
if (cv::waitKey(1) == 27) break;
199
}
200
201
std::cout << "Saving depth estimation paraeters ......";
202
203
cv::FileStorage cv_file = cv::FileStorage("../data/depth_estimation_params_cpp.xml", cv::FileStorage::WRITE);
204
cv_file.write("numDisparities",numDisparities);
205
cv_file.write("blockSize",blockSize);
206
cv_file.write("preFilterType",preFilterType);
207
cv_file.write("preFilterSize",preFilterSize);
208
cv_file.write("preFilterCap",preFilterCap);
209
cv_file.write("textureThreshold",textureThreshold);
210
cv_file.write("uniquenessRatio",uniquenessRatio);
211
cv_file.write("speckleRange",speckleRange);
212
cv_file.write("speckleWindowSize",speckleWindowSize);
213
cv_file.write("disp12MaxDiff",disp12MaxDiff);
214
cv_file.write("minDisparity",minDisparity);
215
cv_file.write("M",39.075);
216
cv_file.release();
217
218
return 0;
219
}
220
221