1"""
218. ์นด๋ฉ๋ผ ์บ๋ฆฌ๋ธ๋ ์ด์
3- ์นด๋ฉ๋ผ ๋ด๋ถ ํ๋ผ๋ฏธํฐ
4- ์๊ณก ๋ณด์
5- ์ฒด์ค๋ณด๋ ๊ฒ์ถ
6- ์คํ
๋ ์ค ๋น์ ๊ธฐ์ด
7"""
8
9import cv2
10import numpy as np
11
12
13def camera_model_concept():
14 """์นด๋ฉ๋ผ ๋ชจ๋ธ ๊ฐ๋
"""
15 print("=" * 50)
16 print("์นด๋ฉ๋ผ ๋ชจ๋ธ ๊ฐ๋
")
17 print("=" * 50)
18
19 print("\n1. ํํ ์นด๋ฉ๋ผ ๋ชจ๋ธ")
20 print(" - 3D ์ โ 2D ์ด๋ฏธ์ง ํฌ์")
21 print(" - ์๊ทผ ํฌ์ (Perspective Projection)")
22
23 print("\n2. ์นด๋ฉ๋ผ ๋ด๋ถ ํ๋ผ๋ฏธํฐ (Intrinsic)")
24 print("""
25 K = | fx 0 cx |
26 | 0 fy cy |
27 | 0 0 1 |
28
29 fx, fy: ์ด์ ๊ฑฐ๋ฆฌ (ํฝ์
๋จ์)
30 cx, cy: ์ฃผ์ (principal point, ์ด๋ฏธ์ง ์ค์ฌ)
31""")
32
33 print("3. ์นด๋ฉ๋ผ ์ธ๋ถ ํ๋ผ๋ฏธํฐ (Extrinsic)")
34 print(" - R: ํ์ ํ๋ ฌ (3x3)")
35 print(" - t: ํํ ์ด๋ ๋ฒกํฐ (3x1)")
36 print(" - ์๋ ์ขํ โ ์นด๋ฉ๋ผ ์ขํ ๋ณํ")
37
38 print("\n4. ํฌ์ ํ๋ ฌ")
39 print(" P = K[R|t]")
40 print(" p = P * X (๋์ฐจ ์ขํ๊ณ)")
41
42 print("\n5. ์๊ณก ๊ณ์ (Distortion Coefficients)")
43 print(" - k1, k2, k3: ๋ฐฉ์ฌ ์๊ณก (radial)")
44 print(" - p1, p2: ์ ์ ์๊ณก (tangential)")
45 print(" - dist_coeffs = [k1, k2, p1, p2, k3]")
46
47
48def create_chessboard_image():
49 """์ฒด์ค๋ณด๋ ์ด๋ฏธ์ง ์์ฑ"""
50 # ์ฒด์ค๋ณด๋ ํจํด
51 rows, cols = 7, 9
52 square_size = 40
53
54 img = np.zeros((rows * square_size, cols * square_size, 3), dtype=np.uint8)
55 img[:] = [255, 255, 255]
56
57 for i in range(rows):
58 for j in range(cols):
59 if (i + j) % 2 == 1:
60 x1, y1 = j * square_size, i * square_size
61 x2, y2 = x1 + square_size, y1 + square_size
62 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 0), -1)
63
64 return img
65
66
67def chessboard_detection_demo():
68 """์ฒด์ค๋ณด๋ ์ฝ๋ ๊ฒ์ถ ๋ฐ๋ชจ"""
69 print("\n" + "=" * 50)
70 print("์ฒด์ค๋ณด๋ ์ฝ๋ ๊ฒ์ถ")
71 print("=" * 50)
72
73 # ์ฒด์ค๋ณด๋ ์ด๋ฏธ์ง ์์ฑ
74 chessboard = create_chessboard_image()
75
76 # ์ฝ๊ฐ์ ์๊ทผ ๋ณํ ์ ์ฉ (์ค์ ์ดฌ์ ์๋ฎฌ๋ ์ด์
)
77 h, w = chessboard.shape[:2]
78 src_pts = np.float32([[0, 0], [w, 0], [w, h], [0, h]])
79 dst_pts = np.float32([[20, 30], [w-30, 20], [w-20, h-10], [10, h-30]])
80 M = cv2.getPerspectiveTransform(src_pts, dst_pts)
81 warped = cv2.warpPerspective(chessboard, M, (w, h), borderValue=(200, 200, 200))
82
83 # ๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ
84 gray = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
85
86 # ์ฝ๋ ๊ฒ์ถ ํ๋ผ๋ฏธํฐ
87 # ๋ด๋ถ ์ฝ๋ ์ (๊ฒ์์-ํฐ์ ๊ต์ฐจ์ )
88 pattern_size = (8, 6) # ๊ฐ๋ก 8, ์ธ๋ก 6 ์ฝ๋
89
90 # ์ฝ๋ ๊ฒ์ถ
91 found, corners = cv2.findChessboardCorners(
92 gray, pattern_size,
93 flags=cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_NORMALIZE_IMAGE
94 )
95
96 print(f"ํจํด ํฌ๊ธฐ: {pattern_size}")
97 print(f"์ฝ๋ ๊ฒ์ถ ์ฑ๊ณต: {found}")
98
99 if found:
100 # ์๋ธํฝ์
์ ๋ฐ๋๋ก ๊ฐ์
101 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
102 corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
103
104 print(f"๊ฒ์ถ๋ ์ฝ๋ ์: {len(corners)}")
105
106 # ๊ฒฐ๊ณผ ์๊ฐํ
107 result = warped.copy()
108 cv2.drawChessboardCorners(result, pattern_size, corners, found)
109
110 cv2.imwrite('chessboard_input.jpg', warped)
111 cv2.imwrite('chessboard_corners.jpg', result)
112 print("์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ")
113
114 print("\n๊ฒ์ถ ํ๋๊ทธ:")
115 print(" CALIB_CB_ADAPTIVE_THRESH: ์ ์์ ์ด์งํ")
116 print(" CALIB_CB_NORMALIZE_IMAGE: ์ด๋ฏธ์ง ์ ๊ทํ")
117 print(" CALIB_CB_FAST_CHECK: ๋น ๋ฅธ ์ฒดํฌ (์คํจ ์ ์กฐ๊ธฐ ์ข
๋ฃ)")
118
119
120def camera_calibration_simulation():
121 """์นด๋ฉ๋ผ ์บ๋ฆฌ๋ธ๋ ์ด์
์๋ฎฌ๋ ์ด์
"""
122 print("\n" + "=" * 50)
123 print("์นด๋ฉ๋ผ ์บ๋ฆฌ๋ธ๋ ์ด์
์๋ฎฌ๋ ์ด์
")
124 print("=" * 50)
125
126 # ์ฒด์ค๋ณด๋ ํ๋ผ๋ฏธํฐ
127 pattern_size = (8, 6)
128 square_size = 1.0 # ์ค์ ์ฌ๊ฐํ ํฌ๊ธฐ (๋จ์: cm, mm ๋ฑ)
129
130 # 3D ๊ฐ์ฒด ์ (์ฒด์ค๋ณด๋ ํ๋ฉด, z=0)
131 objp = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)
132 objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
133 objp *= square_size
134
135 print(f"๊ฐ์ฒด ์ (3D): {objp.shape}")
136 print(f"์ฒซ ๋ฒ์งธ ์ : {objp[0]}")
137 print(f"๋ง์ง๋ง ์ : {objp[-1]}")
138
139 # ์๋ฎฌ๋ ์ด์
์ฉ ์ฌ๋ฌ ์ด๋ฏธ์ง์์ ๊ฒ์ถ๋ ์ ๋ค
140 objpoints = [] # 3D ์ ๋ค
141 imgpoints = [] # 2D ์ ๋ค
142
143 # ์๋ฎฌ๋ ์ด์
(์ค์ ๋ก๋ ์ฌ๋ฌ ๊ฐ๋์์ ์ดฌ์ํ ์ด๋ฏธ์ง ์ฌ์ฉ)
144 chessboard = create_chessboard_image()
145 gray = cv2.cvtColor(chessboard, cv2.COLOR_BGR2GRAY)
146
147 found, corners = cv2.findChessboardCorners(gray, pattern_size)
148
149 if found:
150 objpoints.append(objp)
151 imgpoints.append(corners)
152
153 print(f"\n์ฌ์ฉ๋ ์ด๋ฏธ์ง ์: {len(objpoints)}")
154
155 # ์บ๋ฆฌ๋ธ๋ ์ด์
(์ต์ 3-5๊ฐ ์ด๋ฏธ์ง ํ์)
156 # ์ฌ๊ธฐ์๋ ์๋ฎฌ๋ ์ด์
์ด๋ฏ๋ก ์ค์ ๊ฒฐ๊ณผ์ ๋ค๋ฅผ ์ ์์
157 h, w = gray.shape
158
159 # ์ด๊ธฐ ์นด๋ฉ๋ผ ํ๋ ฌ ์ถ์
160 fx = fy = w # ๋๋ต์ ์ด์ ๊ฑฐ๋ฆฌ
161 cx, cy = w/2, h/2
162
163 camera_matrix = np.array([
164 [fx, 0, cx],
165 [0, fy, cy],
166 [0, 0, 1]
167 ], dtype=np.float64)
168
169 dist_coeffs = np.zeros(5)
170
171 print("\n์ถ์ ๋ ์นด๋ฉ๋ผ ํ๋ ฌ:")
172 print(camera_matrix)
173
174 print("\n์บ๋ฆฌ๋ธ๋ ์ด์
ํ๋ก์ธ์ค:")
175 print(" 1. ์ฌ๋ฌ ๊ฐ๋์์ ์ฒด์ค๋ณด๋ ์ดฌ์ (10-20์ฅ)")
176 print(" 2. ๊ฐ ์ด๋ฏธ์ง์์ ์ฝ๋ ๊ฒ์ถ")
177 print(" 3. cv2.calibrateCamera() ํธ์ถ")
178 print(" 4. ์นด๋ฉ๋ผ ํ๋ ฌ, ์๊ณก ๊ณ์ ํ๋")
179
180
181def calibration_workflow():
182 """์บ๋ฆฌ๋ธ๋ ์ด์
์ํฌํ๋ก์ฐ"""
183 print("\n" + "=" * 50)
184 print("์ค์ ์บ๋ฆฌ๋ธ๋ ์ด์
์ํฌํ๋ก์ฐ")
185 print("=" * 50)
186
187 code = '''
188import cv2
189import numpy as np
190import glob
191
192# ์ฒด์ค๋ณด๋ ์ค์
193pattern_size = (9, 6) # ๋ด๋ถ ์ฝ๋ ์
194square_size = 25.0 # mm ๋จ์
195
196# ๊ฐ์ฒด ์ ์์ฑ
197objp = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)
198objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
199objp *= square_size
200
201objpoints = [] # 3D
202imgpoints = [] # 2D
203
204# ์ด๋ฏธ์ง ๋ก๋ ๋ฐ ์ฝ๋ ๊ฒ์ถ
205images = glob.glob('calibration_images/*.jpg')
206
207for fname in images:
208 img = cv2.imread(fname)
209 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
210
211 found, corners = cv2.findChessboardCorners(gray, pattern_size)
212
213 if found:
214 objpoints.append(objp)
215 corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1),
216 (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
217 imgpoints.append(corners2)
218
219# ์บ๋ฆฌ๋ธ๋ ์ด์
์ํ
220ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(
221 objpoints, imgpoints, gray.shape[::-1], None, None
222)
223
224print(f"RMS error: {ret}")
225print(f"Camera matrix:\\n{camera_matrix}")
226print(f"Distortion coefficients:\\n{dist_coeffs}")
227
228# ๊ฒฐ๊ณผ ์ ์ฅ
229np.savez('calibration.npz',
230 camera_matrix=camera_matrix,
231 dist_coeffs=dist_coeffs)
232'''
233
234 print(code)
235
236 print("\n์บ๋ฆฌ๋ธ๋ ์ด์
ํ:")
237 print(" 1. ์ต์ 10-20์ฅ์ ์ด๋ฏธ์ง ์ฌ์ฉ")
238 print(" 2. ๋ค์ํ ๊ฐ๋์ ์์น์์ ์ดฌ์")
239 print(" 3. ์ฒด์ค๋ณด๋๊ฐ ์ด๋ฏธ์ง ์ ์ฒด์ ๋ถํฌํ๋๋ก")
240 print(" 4. ์กฐ๋ช
์ด ๊ท ์ผํด์ผ ํจ")
241 print(" 5. ๋ธ๋ฌ ์์ด ์ ๋ช
ํ ์ด๋ฏธ์ง")
242
243
244def undistort_demo():
245 """์๊ณก ๋ณด์ ๋ฐ๋ชจ"""
246 print("\n" + "=" * 50)
247 print("์๊ณก ๋ณด์ (Undistortion)")
248 print("=" * 50)
249
250 # ์๋ฎฌ๋ ์ด์
์ฉ ์๊ณก ์ด๋ฏธ์ง ์์ฑ
251 img = np.zeros((400, 600, 3), dtype=np.uint8)
252 img[:] = [200, 200, 200]
253
254 # ๊ฒฉ์ ํจํด
255 for i in range(0, 600, 50):
256 cv2.line(img, (i, 0), (i, 400), (0, 0, 0), 1)
257 for j in range(0, 400, 50):
258 cv2.line(img, (0, j), (600, j), (0, 0, 0), 1)
259
260 # ๊ฐ์์ ์๊ณก ์ ์ฉ (barrel distortion ์๋ฎฌ๋ ์ด์
)
261 h, w = img.shape[:2]
262 camera_matrix = np.array([
263 [w, 0, w/2],
264 [0, w, h/2],
265 [0, 0, 1]
266 ], dtype=np.float64)
267
268 # ์๊ณก ๊ณ์ (k1์ด ์์๋ฉด barrel, ์์๋ฉด pincushion)
269 dist_coeffs = np.array([-0.3, 0.1, 0, 0, 0])
270
271 # ์๊ณก ์ ์ฉ (์ญ์ผ๋ก undistort ์ฌ์ฉ)
272 distorted = cv2.undistort(img, camera_matrix, -dist_coeffs)
273
274 # ์๊ณก ๋ณด์
275 undistorted = cv2.undistort(distorted, camera_matrix, dist_coeffs)
276
277 cv2.imwrite('undistort_original.jpg', img)
278 cv2.imwrite('undistort_distorted.jpg', distorted)
279 cv2.imwrite('undistort_corrected.jpg', undistorted)
280
281 print("์๊ณก ๋ณด์ ๋ฐฉ๋ฒ:")
282 print(" 1. cv2.undistort()")
283 print(" - ๊ฐ๋จํ๊ฒ ์ฌ์ฉ")
284 print(" - ๋งค๋ฒ ๊ณ์ฐ")
285
286 print("\n 2. cv2.initUndistortRectifyMap() + cv2.remap()")
287 print(" - ๋งต์ ๋ฏธ๋ฆฌ ๊ณ์ฐ")
288 print(" - ๋น๋์ค์์ ํจ์จ์ ")
289
290 code = '''
291# ํจ์จ์ ์ธ ๋ฐฉ๋ฒ (๋น๋์ค์ฉ)
292map1, map2 = cv2.initUndistortRectifyMap(
293 camera_matrix, dist_coeffs, None,
294 camera_matrix, (w, h), cv2.CV_32FC1
295)
296
297# ํ๋ ์๋ง๋ค ์ ์ฉ
298undistorted = cv2.remap(distorted, map1, map2, cv2.INTER_LINEAR)
299'''
300 print(code)
301
302
303def stereo_vision_concept():
304 """์คํ
๋ ์ค ๋น์ ๊ฐ๋
"""
305 print("\n" + "=" * 50)
306 print("์คํ
๋ ์ค ๋น์ ๊ธฐ์ด")
307 print("=" * 50)
308
309 print("\n1. ์คํ
๋ ์ค ๋น์ ์๋ฆฌ")
310 print(" - ๋ ์นด๋ฉ๋ผ๋ก ๋์ผ ์ฅ๋ฉด ์ดฌ์")
311 print(" - ์์ฐจ(disparity)๋ก ๊น์ด ๊ณ์ฐ")
312 print(" - depth = (baseline * focal_length) / disparity")
313
314 print("\n2. ์คํ
๋ ์ค ์บ๋ฆฌ๋ธ๋ ์ด์
")
315 print(" - ๊ฐ ์นด๋ฉ๋ผ ๊ฐ๋ณ ์บ๋ฆฌ๋ธ๋ ์ด์
")
316 print(" - ์คํ
๋ ์ค ์ ์บ๋ฆฌ๋ธ๋ ์ด์
")
317 print(" - ์ํผํด๋ผ ๊ธฐํํ ๊ณ์ฐ")
318
319 code = '''
320# ์คํ
๋ ์ค ์บ๋ฆฌ๋ธ๋ ์ด์
321ret, K1, D1, K2, D2, R, T, E, F = cv2.stereoCalibrate(
322 objpoints, imgpoints_left, imgpoints_right,
323 K1, D1, K2, D2, image_size,
324 flags=cv2.CALIB_FIX_INTRINSIC
325)
326'''
327 print(code)
328
329 print("\n3. ์คํ
๋ ์ค ์ ํฉ (Stereo Rectification)")
330 print(" - ๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ํ๋ฉด์ผ๋ก ์ ๋ ฌ")
331 print(" - ์ํ์ ์์์๋ง ๋งค์นญ ํ์")
332
333 print("\n4. ์์ฐจ ๋งต ๊ณ์ฐ")
334 print(" - StereoBM: Block Matching (๋น ๋ฆ)")
335 print(" - StereoSGBM: Semi-Global BM (์ ํ)")
336
337
338def stereo_matching_demo():
339 """์คํ
๋ ์ค ๋งค์นญ ์๋ฎฌ๋ ์ด์
"""
340 print("\n" + "=" * 50)
341 print("์คํ
๋ ์ค ๋งค์นญ ์๋ฎฌ๋ ์ด์
")
342 print("=" * 50)
343
344 # ์๋ฎฌ๋ ์ด์
์ฉ ์คํ
๋ ์ค ์ด๋ฏธ์ง ์ ์์ฑ
345 left = np.zeros((300, 400), dtype=np.uint8)
346 left[:] = 150
347 cv2.rectangle(left, (100, 100), (200, 200), 80, -1) # ๊ฐ๊น์ด ๊ฐ์ฒด
348 cv2.rectangle(left, (250, 120), (350, 180), 100, -1) # ๋จผ ๊ฐ์ฒด
349
350 # ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง (์์ฐจ ์ ์ฉ)
351 right = np.zeros((300, 400), dtype=np.uint8)
352 right[:] = 150
353 cv2.rectangle(right, (80, 100), (180, 200), 80, -1) # ์์ฐจ 20 (๊ฐ๊น์)
354 cv2.rectangle(right, (240, 120), (340, 180), 100, -1) # ์์ฐจ 10 (๋ฉ์)
355
356 # StereoBM
357 stereo_bm = cv2.StereoBM_create(numDisparities=64, blockSize=15)
358 disparity_bm = stereo_bm.compute(left, right)
359
360 # StereoSGBM
361 stereo_sgbm = cv2.StereoSGBM_create(
362 minDisparity=0,
363 numDisparities=64,
364 blockSize=5,
365 P1=8 * 3 * 5 ** 2,
366 P2=32 * 3 * 5 ** 2,
367 disp12MaxDiff=1,
368 uniquenessRatio=10,
369 speckleWindowSize=100,
370 speckleRange=32
371 )
372 disparity_sgbm = stereo_sgbm.compute(left, right)
373
374 # ์ ๊ทํ
375 disparity_bm_norm = cv2.normalize(disparity_bm, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
376 disparity_sgbm_norm = cv2.normalize(disparity_sgbm, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
377
378 cv2.imwrite('stereo_left.jpg', left)
379 cv2.imwrite('stereo_right.jpg', right)
380 cv2.imwrite('stereo_disparity_bm.jpg', disparity_bm_norm)
381 cv2.imwrite('stereo_disparity_sgbm.jpg', disparity_sgbm_norm)
382
383 print("์์ฐจ ๋งต ์์ฑ ์๋ฃ")
384 print("\nStereoBM ํ๋ผ๋ฏธํฐ:")
385 print(" numDisparities: ์์ฐจ ๋ฒ์ (16์ ๋ฐฐ์)")
386 print(" blockSize: ๋งค์นญ ๋ธ๋ก ํฌ๊ธฐ (ํ์, 5~21)")
387
388 print("\nStereoSGBM ํ๋ผ๋ฏธํฐ:")
389 print(" P1, P2: ๋ถ๋๋ฌ์ ์ ์ด")
390 print(" uniquenessRatio: ๋งค์นญ ๊ณ ์ ์ฑ")
391 print(" speckleWindowSize: ์คํํด ํํฐ ํฌ๊ธฐ")
392
393
394def pose_estimation_concept():
395 """ํฌ์ฆ ์ถ์ ๊ฐ๋
"""
396 print("\n" + "=" * 50)
397 print("ํฌ์ฆ ์ถ์ (Pose Estimation)")
398 print("=" * 50)
399
400 print("\n์นด๋ฉ๋ผ ํฌ์ฆ ์ถ์ :")
401 print(" - 3D-2D ๋์์ ์ผ๋ก ์นด๋ฉ๋ผ ์์น/๋ฐฉํฅ ์ถ์ ")
402 print(" - cv2.solvePnP()")
403
404 code = '''
405# 3D ๊ฐ์ฒด ์ (์๋ ค์ง ์๋ ์ขํ)
406object_points = np.array([
407 [0, 0, 0],
408 [1, 0, 0],
409 [0, 1, 0],
410 [1, 1, 0]
411], dtype=np.float32)
412
413# 2D ์ด๋ฏธ์ง ์ (๊ฒ์ถ๋ ์ขํ)
414image_points = np.array([...], dtype=np.float32)
415
416# ํฌ์ฆ ์ถ์
417success, rvec, tvec = cv2.solvePnP(
418 object_points, image_points,
419 camera_matrix, dist_coeffs
420)
421
422# ํ์ ๋ฒกํฐ โ ํ์ ํ๋ ฌ
423rotation_matrix, _ = cv2.Rodrigues(rvec)
424
425# 3D ์ถ ๊ทธ๋ฆฌ๊ธฐ
426axis_points = np.float32([
427 [3, 0, 0], [0, 3, 0], [0, 0, -3]
428]).reshape(-1, 3)
429imgpts, _ = cv2.projectPoints(
430 axis_points, rvec, tvec, camera_matrix, dist_coeffs
431)
432'''
433 print(code)
434
435 print("\nํ์ฉ:")
436 print(" - AR (Augmented Reality)")
437 print(" - ๋ก๋ด ๋น์ ")
438 print(" - 3D ์ฌ๊ตฌ์ฑ")
439
440
441def main():
442 """๋ฉ์ธ ํจ์"""
443 # ์นด๋ฉ๋ผ ๋ชจ๋ธ ๊ฐ๋
444 camera_model_concept()
445
446 # ์ฒด์ค๋ณด๋ ๊ฒ์ถ
447 chessboard_detection_demo()
448
449 # ์บ๋ฆฌ๋ธ๋ ์ด์
์๋ฎฌ๋ ์ด์
450 camera_calibration_simulation()
451
452 # ์บ๋ฆฌ๋ธ๋ ์ด์
์ํฌํ๋ก์ฐ
453 calibration_workflow()
454
455 # ์๊ณก ๋ณด์
456 undistort_demo()
457
458 # ์คํ
๋ ์ค ๋น์
459 stereo_vision_concept()
460
461 # ์คํ
๋ ์ค ๋งค์นญ
462 stereo_matching_demo()
463
464 # ํฌ์ฆ ์ถ์
465 pose_estimation_concept()
466
467 print("\n์นด๋ฉ๋ผ ์บ๋ฆฌ๋ธ๋ ์ด์
๋ฐ๋ชจ ์๋ฃ!")
468
469
470if __name__ == '__main__':
471 main()