質問するログイン新規登録

質問編集履歴

3

太字でプログラムが見えづらくなっていたので修正を行いました。

2019/02/13 08:04

投稿

mosu
mosu

スコア15

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
- #以下3つにprintされたパラメーターを代入
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文などのインデントを表現するために入れました。

2019/02/13 08:04

投稿

mosu
mosu

スコア15

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

1

変数名、などを太字にしました。

2019/02/13 07:57

投稿

mosu
mosu

スコア15

title CHANGED
File without changes
body CHANGED
@@ -4,6 +4,7 @@
4
4
  プログラミング初心者です。
5
5
  Python版のopencvを使って、魚眼ウェブカメラ(画角150°)のキャリブレーションおよび、ひずみ補正をしたのですが、画像のように変にひずみ補正が行われ解決策を探しています。
6
6
  本来は画像の真ん中の茶色い部分を主に補正したいと考えています。
7
+ 右が補正前左が補正後です。
7
8
  ![右が補正前、左が補正後です。](5128ab63061048548ce5b09d4f5d1075.jpeg)
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
- assert float(cv2.__version__.rsplit('.', 1)[0]) >= 3, 'OpenCV version 3 or newer required.'
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
- CHECKERBOARD = (7,10)
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
- cv2.CALIB_CB_ADAPTIVE_THRESH+cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)
51
+ cv2.CALIB_CB_ADAPTIVE_THRESH+cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)
49
52
 
50
- if ret == True:
53
+ **if ret == True:**
51
- objpoints.append(objp)
54
+ objpoints.append(objp)
52
- cv2.cornerSubPix(gray,corners,(3,3),(-1,-1),subpix_criteria)
55
+ cv2.cornerSubPix(gray,corners,(3,3),(-1,-1),subpix_criteria)
53
- imgpoints.append(corners)
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
- K=np.array(K.tolist())
83
+ **DIM**=(_img_shape[::-1])
80
84
 
81
- D=np.array(D.tolist())
85
+ **K**=np.array(K.tolist())
82
86
 
83
- balance=0.1
87
+ **D**=np.array(D.tolist())
84
- dim2=None
85
88
 
89
+ **balance**=0.1
86
- dim3=None
90
+ **dim2**=None
87
91
 
88
- cap = cv2.VideoCapture(0)
92
+ **dim3**=None
89
93
 
94
+ **cap** = cv2.VideoCapture(0)
90
95
 
91
- fourcc = cv2.VideoWriter_fourcc(*'DIVX')
92
96
 
93
- out = cv2.VideoWriter('output.avi',fourcc, 20.0, (1280, 720))
97
+ **fourcc** = cv2.VideoWriter_fourcc(*'DIVX')
94
98
 
95
- out1 = cv2.VideoWriter('undistortedop.avi',fourcc, 20.0, (1280, 720))
99
+ **out** = cv2.VideoWriter('output.avi',fourcc, 20.0, (1280, 720))
96
100
 
97
- while True:
101
+ **out1**= cv2.VideoWriter('undistortedop.avi',fourcc, 20.0, (1280, 720))
98
102
 
99
- ret, frame = cap.read()
103
+ **while True:**
100
104
 
101
- gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
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
- dim2 = dim1
115
+ **if not dim2:**
112
116
 
113
- if not dim3:
117
+ **dim2**= dim1
114
118
 
115
- dim3 = dim1
119
+ **if not dim3:**
116
120
 
117
- dim3=(1280, 720)
121
+ **dim3** = dim1
118
122
 
119
- scaled_K = K * dim1[0] / DIM[0] # The values of K is to scale with image dimension.
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 = cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(scaled_K, D, dim2, np.eye(3), balance=balance)
130
+ **new_K**= cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(scaled_K, D, dim2, np.eye(3), balance=balance)
125
131
 
126
- map1, map2 = cv2.fisheye.initUndistortRectifyMap(K,D,np.eye(3),new_K,DIM, cv2.CV_16SC2)
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
- cv2.imshow('frame',frame)
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
  キャリブレーション用画像の取り直し。