Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hackassin
GitHub Repository: hackassin/learnopencv
Path: blob/master/Depth-Perception-Using-Stereo-Camera/python/disparity_params_gui.py
3142 views
1
import numpy as np
2
import cv2
3
4
5
# Check for left and right camera IDs
6
# These values can change depending on the system
7
CamL_id = 2 # Camera ID for left camera
8
CamR_id = 0 # Camera ID for right camera
9
10
CamL= cv2.VideoCapture(CamL_id)
11
CamR= cv2.VideoCapture(CamR_id)
12
13
# Reading the mapping values for stereo image rectification
14
cv_file = cv2.FileStorage("../data/stereo_rectify_maps.xml", cv2.FILE_STORAGE_READ)
15
Left_Stereo_Map_x = cv_file.getNode("Left_Stereo_Map_x").mat()
16
Left_Stereo_Map_y = cv_file.getNode("Left_Stereo_Map_y").mat()
17
Right_Stereo_Map_x = cv_file.getNode("Right_Stereo_Map_x").mat()
18
Right_Stereo_Map_y = cv_file.getNode("Right_Stereo_Map_y").mat()
19
cv_file.release()
20
21
def nothing(x):
22
pass
23
24
cv2.namedWindow('disp',cv2.WINDOW_NORMAL)
25
cv2.resizeWindow('disp',600,600)
26
27
cv2.createTrackbar('numDisparities','disp',1,17,nothing)
28
cv2.createTrackbar('blockSize','disp',5,50,nothing)
29
cv2.createTrackbar('preFilterType','disp',1,1,nothing)
30
cv2.createTrackbar('preFilterSize','disp',2,25,nothing)
31
cv2.createTrackbar('preFilterCap','disp',5,62,nothing)
32
cv2.createTrackbar('textureThreshold','disp',10,100,nothing)
33
cv2.createTrackbar('uniquenessRatio','disp',15,100,nothing)
34
cv2.createTrackbar('speckleRange','disp',0,100,nothing)
35
cv2.createTrackbar('speckleWindowSize','disp',3,25,nothing)
36
cv2.createTrackbar('disp12MaxDiff','disp',5,25,nothing)
37
cv2.createTrackbar('minDisparity','disp',5,25,nothing)
38
39
# Creating an object of StereoBM algorithm
40
stereo = cv2.StereoBM_create()
41
42
while True:
43
44
# Capturing and storing left and right camera images
45
retL, imgL= CamL.read()
46
retR, imgR= CamR.read()
47
48
# Proceed only if the frames have been captured
49
if retL and retR:
50
imgR_gray = cv2.cvtColor(imgR,cv2.COLOR_BGR2GRAY)
51
imgL_gray = cv2.cvtColor(imgL,cv2.COLOR_BGR2GRAY)
52
53
# Applying stereo image rectification on the left image
54
Left_nice= cv2.remap(imgL_gray,
55
Left_Stereo_Map_x,
56
Left_Stereo_Map_y,
57
cv2.INTER_LANCZOS4,
58
cv2.BORDER_CONSTANT,
59
0)
60
61
# Applying stereo image rectification on the right image
62
Right_nice= cv2.remap(imgR_gray,
63
Right_Stereo_Map_x,
64
Right_Stereo_Map_y,
65
cv2.INTER_LANCZOS4,
66
cv2.BORDER_CONSTANT,
67
0)
68
69
# Updating the parameters based on the trackbar positions
70
numDisparities = cv2.getTrackbarPos('numDisparities','disp')*16
71
blockSize = cv2.getTrackbarPos('blockSize','disp')*2 + 5
72
preFilterType = cv2.getTrackbarPos('preFilterType','disp')
73
preFilterSize = cv2.getTrackbarPos('preFilterSize','disp')*2 + 5
74
preFilterCap = cv2.getTrackbarPos('preFilterCap','disp')
75
textureThreshold = cv2.getTrackbarPos('textureThreshold','disp')
76
uniquenessRatio = cv2.getTrackbarPos('uniquenessRatio','disp')
77
speckleRange = cv2.getTrackbarPos('speckleRange','disp')
78
speckleWindowSize = cv2.getTrackbarPos('speckleWindowSize','disp')*2
79
disp12MaxDiff = cv2.getTrackbarPos('disp12MaxDiff','disp')
80
minDisparity = cv2.getTrackbarPos('minDisparity','disp')
81
82
# Setting the updated parameters before computing disparity map
83
stereo.setNumDisparities(numDisparities)
84
stereo.setBlockSize(blockSize)
85
stereo.setPreFilterType(preFilterType)
86
stereo.setPreFilterSize(preFilterSize)
87
stereo.setPreFilterCap(preFilterCap)
88
stereo.setTextureThreshold(textureThreshold)
89
stereo.setUniquenessRatio(uniquenessRatio)
90
stereo.setSpeckleRange(speckleRange)
91
stereo.setSpeckleWindowSize(speckleWindowSize)
92
stereo.setDisp12MaxDiff(disp12MaxDiff)
93
stereo.setMinDisparity(minDisparity)
94
95
# Calculating disparity using the StereoBM algorithm
96
disparity = stereo.compute(Left_nice,Right_nice)
97
# NOTE: compute returns a 16bit signed single channel image,
98
# CV_16S containing a disparity map scaled by 16. Hence it
99
# is essential to convert it to CV_32F and scale it down 16 times.
100
101
# Converting to float32
102
disparity = disparity.astype(np.float32)
103
104
# Scaling down the disparity values and normalizing them
105
disparity = (disparity/16.0 - minDisparity)/numDisparities
106
107
# Displaying the disparity map
108
cv2.imshow("disp",disparity)
109
110
# Close window using esc key
111
if cv2.waitKey(1) == 27:
112
break
113
114
else:
115
CamL= cv2.VideoCapture(CamL_id)
116
CamR= cv2.VideoCapture(CamR_id)
117
118
print("Saving depth estimation paraeters ......")
119
120
cv_file = cv2.FileStorage("../data/depth_estmation_params_py.xml", cv2.FILE_STORAGE_WRITE)
121
cv_file.write("numDisparities",numDisparities)
122
cv_file.write("blockSize",blockSize)
123
cv_file.write("preFilterType",preFilterType)
124
cv_file.write("preFilterSize",preFilterSize)
125
cv_file.write("preFilterCap",preFilterCap)
126
cv_file.write("textureThreshold",textureThreshold)
127
cv_file.write("uniquenessRatio",uniquenessRatio)
128
cv_file.write("speckleRange",speckleRange)
129
cv_file.write("speckleWindowSize",speckleWindowSize)
130
cv_file.write("disp12MaxDiff",disp12MaxDiff)
131
cv_file.write("minDisparity",minDisparity)
132
cv_file.write("M",39.075)
133
cv_file.release()
134