質問編集履歴
3
太字でプログラムが見えづらくなっていたので修正を行いました。
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
print("DIM=" + str(_img_shape[::-1]))
|
|
70
70
|
print("K=np.array(" + str(K.tolist()) + ")")
|
|
71
71
|
print("D=np.array(" + str(D.tolist()) + ")")
|
|
72
|
-
|
|
72
|
+
**以下3つにprintされたパラメーターを代入**
|
|
73
73
|
DIM=(_img_shape[::-1])
|
|
74
74
|
K=np.array(K.tolist())
|
|
75
75
|
D=np.array(D.tolist())
|
|
@@ -99,8 +99,7 @@
|
|
|
99
99
|
|
|
100
100
|
[ ]dim1=(1280,720)
|
|
101
101
|
|
|
102
|
-
[ ]assert dim1[0]/dim1[1] == DIM[0]/DIM[1],
|
|
102
|
+
[ ]assert dim1[0]/dim1[1] == DIM[0]/DIM[1],
|
|
103
|
-
|
|
104
103
|
[ ]if not dim2:
|
|
105
104
|
|
|
106
105
|
[ ]dim2 = dim1
|
2
プログラムの整理※プログラム内の[]は無視してください。行頭にスペースを空ける方法がわからなかったので、if文などのインデントを表現するために入れました。
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -15,53 +15,45 @@
|
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
### 該当のソースコード
|
|
18
|
-
|
|
19
|
-
```ここに言語名を入力
|
|
20
|
-
python
|
|
18
|
+
```python
|
|
21
19
|
コード
|
|
22
20
|
```
|
|
23
|
-
|
|
21
|
+
import cv2
|
|
24
|
-
|
|
22
|
+
import numpy as np
|
|
25
|
-
|
|
23
|
+
import os
|
|
26
|
-
|
|
24
|
+
import glob
|
|
27
|
-
|
|
25
|
+
import sys
|
|
28
|
-
|
|
26
|
+
assert float(cv2.__version__.rsplit('.', 1)[0]) >= 3, 'OpenCV version 3 or newer required.'
|
|
29
27
|
|
|
30
|
-
|
|
28
|
+
CHECKERBOARD = (7,10)
|
|
31
|
-
|
|
29
|
+
subpix_criteria = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)
|
|
32
|
-
|
|
30
|
+
calibration_flags=cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC+cv2.fisheye.CALIB_CHECK_COND+cv2.fisheye.CALIB_FIX_SKEW
|
|
33
|
-
+cv2.fisheye.CALIB_FIX_SKEW
|
|
34
|
-
|
|
31
|
+
objp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)
|
|
35
|
-
|
|
32
|
+
objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
|
|
36
|
-
|
|
33
|
+
_img_shape = None
|
|
37
|
-
|
|
34
|
+
objpoints = [] # 3d point in real world space
|
|
38
|
-
|
|
35
|
+
imgpoints = [] # 2d points in image plane.
|
|
39
|
-
|
|
36
|
+
images = glob.glob(r'C:\Users\Gen\Pictures\Camera Roll*jpg')#ここにキャリブレーションしたいフォルダ名を入力
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
for fname in images:
|
|
43
|
-
|
|
38
|
+
[ ]img = cv2.imread(fname)
|
|
44
|
-
|
|
39
|
+
[ ]if _img_shape == None:
|
|
45
|
-
|
|
40
|
+
[ ]_img_shape = img.shape[:2]
|
|
46
|
-
|
|
41
|
+
[ ]else:
|
|
47
|
-
|
|
42
|
+
[ ]assert _img_shape == img.shape[:2], "All images must share the same size."
|
|
48
|
-
|
|
43
|
+
[ ]gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
|
|
51
|
-
|
|
45
|
+
[ ]ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH+cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)
|
|
52
|
-
|
|
46
|
+
|
|
53
|
-
|
|
47
|
+
[ ]if ret == True:
|
|
54
|
-
|
|
48
|
+
[ ]objpoints.append(objp)
|
|
55
|
-
|
|
49
|
+
[ ]cv2.cornerSubPix(gray,corners,(3,3),(-1,-1),subpix_criteria)
|
|
56
|
-
|
|
50
|
+
[ ]imgpoints.append(corners)
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
N_OK = len(objpoints)
|
|
59
|
-
|
|
52
|
+
K = np.zeros((3, 3))
|
|
60
|
-
|
|
53
|
+
D = np.zeros((4, 1))
|
|
61
|
-
|
|
54
|
+
rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
|
|
62
|
-
|
|
55
|
+
tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
|
|
63
|
-
|
|
64
|
-
|
|
56
|
+
rms, _, _, _, _ = \
|
|
65
57
|
cv2.fisheye.calibrate(
|
|
66
58
|
objpoints,
|
|
67
59
|
imgpoints,
|
|
@@ -73,87 +65,91 @@
|
|
|
73
65
|
calibration_flags,
|
|
74
66
|
(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)
|
|
75
67
|
)
|
|
68
|
+
print("Found " + str(N_OK) + " valid images for calibration")
|
|
69
|
+
print("DIM=" + str(_img_shape[::-1]))
|
|
70
|
+
print("K=np.array(" + str(K.tolist()) + ")")
|
|
71
|
+
print("D=np.array(" + str(D.tolist()) + ")")
|
|
72
|
+
#以下3つにprintされたパラメーターを代入
|
|
73
|
+
DIM=(_img_shape[::-1])
|
|
74
|
+
K=np.array(K.tolist())
|
|
75
|
+
D=np.array(D.tolist())
|
|
76
76
|
|
|
77
|
-
**print**("Found " + str(N_OK) + " valid images for calibration")
|
|
78
|
-
|
|
77
|
+
balance=0.95
|
|
79
|
-
**print**("K=np.array(" + str(K.tolist()) + ")")
|
|
80
|
-
**print**("D=np.array(" + str(D.tolist()) + ")")
|
|
81
78
|
|
|
79
|
+
dim2=None
|
|
82
80
|
|
|
83
|
-
|
|
81
|
+
dim3=None
|
|
84
82
|
|
|
85
|
-
|
|
83
|
+
cap = cv2.VideoCapture(0)
|
|
86
84
|
|
|
87
|
-
**D**=np.array(D.tolist())
|
|
88
85
|
|
|
89
|
-
**balance**=0.1
|
|
90
|
-
**dim2**=None
|
|
91
86
|
|
|
92
|
-
|
|
87
|
+
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
|
|
93
88
|
|
|
94
|
-
|
|
89
|
+
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (1280,720))
|
|
95
90
|
|
|
91
|
+
out1 = cv2.VideoWriter('undistortedop.avi',fourcc, 20.0, (1280,720))
|
|
96
92
|
|
|
97
|
-
|
|
93
|
+
while True:
|
|
98
94
|
|
|
99
|
-
|
|
95
|
+
[ ]ret, frame = cap.read()
|
|
100
96
|
|
|
101
|
-
|
|
97
|
+
[ ]gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
|
102
98
|
|
|
99
|
+
|
|
103
|
-
|
|
100
|
+
[ ]dim1=(1280,720)
|
|
104
101
|
|
|
105
|
-
|
|
102
|
+
[ ]assert dim1[0]/dim1[1] == DIM[0]/DIM[1], "キャリブレーションするためには同じアスペクト比の画像、動画を用いなければならない。"
|
|
106
103
|
|
|
107
|
-
|
|
104
|
+
[ ]if not dim2:
|
|
108
105
|
|
|
109
|
-
|
|
110
|
-
|
|
106
|
+
[ ]dim2 = dim1
|
|
111
107
|
|
|
112
|
-
|
|
108
|
+
[ ]if not dim3:
|
|
113
109
|
|
|
110
|
+
[ ]dim3 = dim1
|
|
114
111
|
|
|
115
|
-
|
|
112
|
+
[ ]dim3=(1280,720)
|
|
116
113
|
|
|
117
|
-
|
|
114
|
+
[ ]scaled_K = K * dim1[0] / DIM[0] # The values of K is to scale with image dimension.
|
|
118
115
|
|
|
119
|
-
|
|
116
|
+
[ ]scaled_K[2][2] = 1.0 # Except that K[2][2] is always 1.0
|
|
117
|
+
|
|
120
118
|
|
|
121
|
-
|
|
119
|
+
[ ]new_K = cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(scaled_K, D, dim2, np.eye(3), balance=balance)
|
|
122
120
|
|
|
123
|
-
|
|
121
|
+
[ ]map1, map2 = cv2.fisheye.initUndistortRectifyMap(scaled_K,D,np.eye(3),new_K,dim3, cv2.CV_16SC2)
|
|
124
122
|
|
|
125
|
-
|
|
123
|
+
[ ]undistorted_img = cv2.remap(frame, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
|
|
124
|
+
|
|
126
125
|
|
|
127
|
-
|
|
126
|
+
|
|
128
|
-
|
|
129
127
|
|
|
130
|
-
|
|
128
|
+
[ ]out1.write(undistorted_img)
|
|
131
129
|
|
|
132
|
-
|
|
130
|
+
[ ]cv2.imshow("undistorted", undistorted_img)
|
|
133
131
|
|
|
134
|
-
**undistorted_img **= cv2.remap(frame, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
|
|
135
132
|
|
|
136
|
-
**out1.write**(undistorted_img)
|
|
137
133
|
|
|
138
|
-
**cv2.imshow**("undistorted", undistorted_img)
|
|
139
134
|
|
|
140
|
-
|
|
135
|
+
[ ]out.write(frame)
|
|
141
136
|
|
|
142
|
-
|
|
137
|
+
[ ]cv2.imshow('frame',frame)
|
|
143
138
|
|
|
144
|
-
**if cv2.waitKey(1) & 0xFF == ord('q'):**
|
|
145
139
|
|
|
146
|
-
|
|
140
|
+
[ ]if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
147
141
|
|
|
148
|
-
|
|
142
|
+
[ ]break
|
|
149
143
|
|
|
150
|
-
|
|
144
|
+
cap.release()
|
|
151
145
|
|
|
152
|
-
|
|
146
|
+
out.release()
|
|
153
147
|
|
|
154
|
-
|
|
148
|
+
out1.release()
|
|
155
|
-
```
|
|
156
149
|
|
|
150
|
+
cv2.destroyAllWindows()
|
|
151
|
+
|
|
152
|
+
|
|
157
153
|
### 試したこと
|
|
158
154
|
キャリブレーション用画像の取り直し。
|
|
159
155
|
異なった照明状況での撮影。
|
1
変数名、などを太字にしました。
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
プログラミング初心者です。
|
|
5
5
|
Python版のopencvを使って、魚眼ウェブカメラ(画角150°)のキャリブレーションおよび、ひずみ補正をしたのですが、画像のように変にひずみ補正が行われ解決策を探しています。
|
|
6
6
|
本来は画像の真ん中の茶色い部分を主に補正したいと考えています。
|
|
7
|
+
右が補正前左が補正後です。
|
|
7
8
|

|
|
8
9
|
|
|
9
10
|
|
|
@@ -17,46 +18,50 @@
|
|
|
17
18
|
|
|
18
19
|
```ここに言語名を入力
|
|
19
20
|
python
|
|
20
|
-
|
|
21
|
+
コード
|
|
21
22
|
```
|
|
22
|
-
import cv2
|
|
23
|
+
**import** cv2
|
|
23
|
-
import numpy as np
|
|
24
|
+
**import** numpy as np
|
|
24
|
-
import os
|
|
25
|
+
**import** os
|
|
25
|
-
import glob
|
|
26
|
+
**import** glob
|
|
26
|
-
import sys
|
|
27
|
+
**import** sys
|
|
28
|
+
**assert** float(cv2.__version__.rsplit('.', 1)[0]) >= 3, 'OpenCV version 3 or newer required.'
|
|
27
29
|
|
|
30
|
+
**CHECKERBOARD** = (7,10)
|
|
31
|
+
**subpix_criteria** = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)
|
|
28
|
-
|
|
32
|
+
**calibration_flags**=cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC+cv2.fisheye.CALIB_CHECK_COND
|
|
33
|
+
+cv2.fisheye.CALIB_FIX_SKEW
|
|
34
|
+
**objp** = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)
|
|
35
|
+
**objp[0,:,:2]** = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
|
|
36
|
+
**_img_shape** = None
|
|
37
|
+
**objpoints** = [] # 3d point in real world space
|
|
38
|
+
**imgpoints** = [] # 2d points in image plane.
|
|
39
|
+
**images** = glob.glob(r'')#ここにキャリブレーションしたいフォルダ名を入力
|
|
29
40
|
|
|
30
|
-
|
|
41
|
+
|
|
31
|
-
subpix_criteria = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)
|
|
32
|
-
calibration_flags = cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC+cv2.fisheye.CALIB_CHECK_COND+cv2.fisheye.CALIB_FIX_SKEW
|
|
33
|
-
objp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)
|
|
34
|
-
objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
|
|
35
|
-
_img_shape = None
|
|
36
|
-
objpoints = [] # 3d point in real world space
|
|
37
|
-
imgpoints = [] # 2d points in image plane.
|
|
38
|
-
images = glob.glob(r'')#ここにキャリブレーションしたいフォルダ名を入力
|
|
39
|
-
for fname in images:
|
|
42
|
+
**for fname in images:**
|
|
40
|
-
img = cv2.imread(fname)
|
|
43
|
+
**img** = cv2.imread(fname)
|
|
41
|
-
if _img_shape == None:
|
|
44
|
+
**if _img_shape** == None:
|
|
42
|
-
_img_shape = img.shape[:2]
|
|
45
|
+
**_img_shape** = img.shape[:2]
|
|
43
|
-
else:
|
|
46
|
+
**else:**
|
|
44
|
-
assert _img_shape == img.shape[:2], "同じサイズの画像を入力"
|
|
47
|
+
**assert _img_shape** == img.shape[:2], "同じサイズの画像を入力"
|
|
45
|
-
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
|
|
48
|
+
**gray** = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
|
|
46
49
|
|
|
47
|
-
ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD,
|
|
50
|
+
**ret, corners** = cv2.findChessboardCorners(gray, CHECKERBOARD,
|
|
48
|
-
|
|
51
|
+
cv2.CALIB_CB_ADAPTIVE_THRESH+cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)
|
|
49
52
|
|
|
50
|
-
|
|
53
|
+
**if ret == True:**
|
|
51
|
-
|
|
54
|
+
objpoints.append(objp)
|
|
52
|
-
|
|
55
|
+
cv2.cornerSubPix(gray,corners,(3,3),(-1,-1),subpix_criteria)
|
|
53
|
-
|
|
56
|
+
imgpoints.append(corners)
|
|
57
|
+
|
|
54
|
-
N_OK = len(objpoints)
|
|
58
|
+
**N_OK** = len(objpoints)
|
|
55
|
-
K = np.zeros((3, 3))
|
|
59
|
+
**K** = np.zeros((3, 3))
|
|
56
|
-
D = np.zeros((4, 1))
|
|
60
|
+
**D** = np.zeros((4, 1))
|
|
57
|
-
rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
|
|
61
|
+
**rvecs** = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
|
|
58
|
-
tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
|
|
62
|
+
**tvecs **= [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
|
|
63
|
+
|
|
59
|
-
rms, _, _, _, _ = \
|
|
64
|
+
**rms, _, _, _, _** = \
|
|
60
65
|
cv2.fisheye.calibrate(
|
|
61
66
|
objpoints,
|
|
62
67
|
imgpoints,
|
|
@@ -68,84 +73,86 @@
|
|
|
68
73
|
calibration_flags,
|
|
69
74
|
(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)
|
|
70
75
|
)
|
|
71
|
-
print("Found " + str(N_OK) + " valid images for calibration")
|
|
72
|
-
print("DIM=" + str(_img_shape[::-1]))
|
|
73
|
-
print("K=np.array(" + str(K.tolist()) + ")")
|
|
74
|
-
print("D=np.array(" + str(D.tolist()) + ")")
|
|
75
76
|
|
|
77
|
+
**print**("Found " + str(N_OK) + " valid images for calibration")
|
|
78
|
+
**print**("DIM=" + str(_img_shape[::-1]))
|
|
79
|
+
**print**("K=np.array(" + str(K.tolist()) + ")")
|
|
80
|
+
**print**("D=np.array(" + str(D.tolist()) + ")")
|
|
76
81
|
|
|
77
|
-
DIM=(_img_shape[::-1])
|
|
78
82
|
|
|
79
|
-
|
|
83
|
+
**DIM**=(_img_shape[::-1])
|
|
80
84
|
|
|
81
|
-
|
|
85
|
+
**K**=np.array(K.tolist())
|
|
82
86
|
|
|
83
|
-
|
|
87
|
+
**D**=np.array(D.tolist())
|
|
84
|
-
dim2=None
|
|
85
88
|
|
|
89
|
+
**balance**=0.1
|
|
86
|
-
|
|
90
|
+
**dim2**=None
|
|
87
91
|
|
|
88
|
-
|
|
92
|
+
**dim3**=None
|
|
89
93
|
|
|
94
|
+
**cap** = cv2.VideoCapture(0)
|
|
90
95
|
|
|
91
|
-
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
|
|
92
96
|
|
|
93
|
-
|
|
97
|
+
**fourcc** = cv2.VideoWriter_fourcc(*'DIVX')
|
|
94
98
|
|
|
95
|
-
|
|
99
|
+
**out** = cv2.VideoWriter('output.avi',fourcc, 20.0, (1280, 720))
|
|
96
100
|
|
|
97
|
-
|
|
101
|
+
**out1**= cv2.VideoWriter('undistortedop.avi',fourcc, 20.0, (1280, 720))
|
|
98
102
|
|
|
99
|
-
|
|
103
|
+
**while True:**
|
|
100
104
|
|
|
101
|
-
|
|
105
|
+
**ret, frame** = cap.read()
|
|
102
106
|
|
|
107
|
+
**gray** = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
|
108
|
+
|
|
103
109
|
|
|
104
|
-
dim1=(1280, 720)
|
|
110
|
+
**dim1**=(1280, 720)
|
|
105
111
|
|
|
106
|
-
assert dim1[0]/dim1[1] == DIM[0]/DIM[1],
|
|
112
|
+
**assert dim1[0]/dim1[1]** == DIM[0]/DIM[1],
|
|
107
|
-
"キャリブレーションするためには同じアスペクト比の画像、動画を用いなければならない。"
|
|
108
113
|
|
|
109
|
-
if not dim2:
|
|
110
114
|
|
|
111
|
-
|
|
115
|
+
**if not dim2:**
|
|
112
116
|
|
|
113
|
-
|
|
117
|
+
**dim2**= dim1
|
|
114
118
|
|
|
115
|
-
|
|
119
|
+
**if not dim3:**
|
|
116
120
|
|
|
117
|
-
|
|
121
|
+
**dim3** = dim1
|
|
118
122
|
|
|
119
|
-
|
|
123
|
+
**dim3**=(1280, 720)
|
|
120
124
|
|
|
125
|
+
**scaled_K** = K * dim1[0] / DIM[0] # The values of K is to scale with image dimension.
|
|
126
|
+
|
|
121
|
-
scaled_K[2][2] = 1.0 # Except that K[2][2] is always 1.0
|
|
127
|
+
**scaled_K[2][2]** = 1.0 # Except that K[2][2] is always 1.0
|
|
122
128
|
|
|
123
129
|
|
|
124
|
-
new_K
|
|
130
|
+
**new_K**= cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(scaled_K, D, dim2, np.eye(3), balance=balance)
|
|
125
131
|
|
|
126
|
-
map1, map2
|
|
132
|
+
**map1, map2**= cv2.fisheye.initUndistortRectifyMap(K,D,np.eye(3),new_K,DIM, cv2.CV_16SC2)
|
|
127
133
|
|
|
128
|
-
undistorted_img = cv2.remap(frame, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
|
|
134
|
+
**undistorted_img **= cv2.remap(frame, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
|
|
129
135
|
|
|
130
|
-
out1.write(undistorted_img)
|
|
136
|
+
**out1.write**(undistorted_img)
|
|
131
137
|
|
|
132
|
-
cv2.imshow("undistorted", undistorted_img)
|
|
138
|
+
**cv2.imshow**("undistorted", undistorted_img)
|
|
133
139
|
|
|
134
|
-
out.write(frame)
|
|
140
|
+
**out.write**(frame)
|
|
135
141
|
|
|
136
|
-
|
|
142
|
+
**cv2.imshow**('frame',frame)
|
|
137
143
|
|
|
138
|
-
if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
144
|
+
**if cv2.waitKey(1) & 0xFF == ord('q'):**
|
|
139
145
|
|
|
140
|
-
break
|
|
146
|
+
**break**
|
|
141
147
|
|
|
142
|
-
cap.release()
|
|
148
|
+
**cap.release()**
|
|
143
149
|
|
|
144
|
-
out.release()
|
|
150
|
+
**out.release()**
|
|
145
151
|
|
|
146
|
-
out1.release()
|
|
152
|
+
**out1.release()**
|
|
147
153
|
|
|
148
|
-
cv2.destroyAllWindows()
|
|
154
|
+
**cv2.destroyAllWindows()**
|
|
155
|
+
```
|
|
149
156
|
|
|
150
157
|
### 試したこと
|
|
151
158
|
キャリブレーション用画像の取り直し。
|