回答編集履歴

4

2018/09/28 03:08

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- 青の点は特徴点に対応る点でしょうか?
59
+ 青の点は object_pts、黒線は lines を描画したもので
60
60
 
61
61
  image_pts をまず検出画像に描画してみて、ちゃんとなっているか見てみるとよいと思います。
62
62
 

3

概要

2018/09/28 03:08

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -49,3 +49,163 @@
49
49
  * object_pts と image_pts の対応関係はあっている?object_pts を matplotlib で3Dプロット、image_pts を画像上に描画して確認
50
50
 
51
51
  * SolvePnP() の外部パラメータ推定はうまくいっている?[こちら](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_calib3d/py_pose/py_pose.html) を参考に、xyz 軸を描画してみる。object_pts を画像上に描画してみる。
52
+
53
+
54
+
55
+ ## object_pts、lines を描画してみました。
56
+
57
+
58
+
59
+ 青の点は顔の特徴点に対応する点でしょうか?
60
+
61
+ image_pts をまず検出画像に描画してみて、ちゃんとなっているか見てみるとよいと思います。
62
+
63
+
64
+
65
+ ![イメージ説明](3b2558c86e9347ab24497063ffbff921.png)
66
+
67
+
68
+
69
+ ```python
70
+
71
+ import numpy as np
72
+
73
+ import matplotlib.pyplot as plt
74
+
75
+ from mpl_toolkits.mplot3d import Axes3D
76
+
77
+ from mpl_toolkits.mplot3d.art3d import Line3DCollection
78
+
79
+
80
+
81
+ object_pts = np.float32(
82
+
83
+ [[0.0, 0.0, 0.0],
84
+
85
+ [0.0, -330.0, -65.0],
86
+
87
+ [-225.0, 170.0, -135.0],
88
+
89
+ [225.0, 170.0, -135.0],
90
+
91
+ [-150.0, -150.0, -125.0],
92
+
93
+ [150.0, -150.0, -125.0]]) / 4.5
94
+
95
+ print(object_pts)
96
+
97
+ # [[ 0. 0. 0. ]
98
+
99
+ # [ 0. -73.333336 -14.444445]
100
+
101
+ # [-50. 37.77778 -30. ]
102
+
103
+ # [ 50. 37.77778 -30. ]
104
+
105
+ # [-33.333332 -33.333332 -27.777779]
106
+
107
+ # [ 33.333332 -33.333332 -27.777779]]
108
+
109
+
110
+
111
+ lines = np.float32([[10.0, 10.0, 10.0],
112
+
113
+ [10.0, 10.0, -10.0],
114
+
115
+ [10.0, -10.0, -10.0],
116
+
117
+ [10.0, -10.0, 10.0],
118
+
119
+ [-10.0, 10.0, 10.0],
120
+
121
+ [-10.0, 10.0, -10.0],
122
+
123
+ [-10.0, -10.0, -10.0],
124
+
125
+ [-10.0, -10.0, 10.0]])
126
+
127
+
128
+
129
+ line_pairs = [[0, 1], [1, 2], [2, 3], [3, 0],
130
+
131
+ [4, 5], [5, 6], [6, 7], [7, 4],
132
+
133
+ [0, 4], [1, 5], [2, 6], [3, 7]]
134
+
135
+
136
+
137
+ # 描画する。
138
+
139
+ ################################################
140
+
141
+
142
+
143
+ # グラフを作成する。
144
+
145
+ fig = plt.figure(figsize=(6, 6))
146
+
147
+ axes = fig.add_subplot(111, projection='3d')
148
+
149
+
150
+
151
+ # ラベル
152
+
153
+ axes.set_xlabel("X-axis")
154
+
155
+ axes.set_ylabel("Y-axis")
156
+
157
+ axes.set_zlabel("Z-axis")
158
+
159
+
160
+
161
+ # 範囲
162
+
163
+ axes.set_xlim(-80, 80)
164
+
165
+ axes.set_ylim(-80, 80)
166
+
167
+ axes.set_zlim(-80, 80)
168
+
169
+
170
+
171
+ # object_pts を描画する。
172
+
173
+ axes.scatter(object_pts[:, 0], object_pts[:, 1], object_pts[:, 2],
174
+
175
+ marker='o', color='b', s=30)
176
+
177
+
178
+
179
+ # lines を描画する。
180
+
181
+ for pair in line_pairs:
182
+
183
+ p1, p2 = lines[pair]
184
+
185
+ axes.add_collection3d(Line3DCollection(
186
+
187
+ [[p1, p2]], colors='black', linewidths=2))
188
+
189
+
190
+
191
+ # xyz 軸を描画する。
192
+
193
+ axes.add_collection3d(Line3DCollection(
194
+
195
+ [[(0, 0, 0), (50, 0, 0)],
196
+
197
+ [(0, 0, 0), (0, 50, 0)],
198
+
199
+ [(0, 0, 0), (0, 0, 50)]],
200
+
201
+ colors=['r', 'g', 'b'],
202
+
203
+ linewidths=2))
204
+
205
+
206
+
207
+ plt.grid()
208
+
209
+ plt.show()
210
+
211
+ ```

2

2018/09/28 03:07

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -15,3 +15,37 @@
15
15
 
16
16
 
17
17
  [こちら](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_calib3d/py_pose/py_pose.html) なども参考にして、 objectPoints を画像上に描画してみてください。
18
+
19
+
20
+
21
+ ----
22
+
23
+
24
+
25
+ ## 顔検出のプログラムの意図
26
+
27
+
28
+
29
+ 1. カメラキャリブレーションで内部パラメータは推定済みとする。
30
+
31
+ 2. 顔が写っている画像から顔の特徴点を抽出し、それから画像座標上の点 (image_pts) を作成する。
32
+
33
+ 3. 画像上の点が対応する世界座標上の点 (object_pts) を、顔の中心が原点となるように作成する。
34
+
35
+ 4. その対応関係を満たすアフィン変換行列を推定する。
36
+
37
+ 5. 4 で求めたのは世界座標から見たカメラのポーズである。世界座標の原点が顔の中心になるのだったから、カメラから見て顔がどの方向を向いているかはアフィン変換行列からわかる。
38
+
39
+
40
+
41
+ ## うまくいかない原因となりうる可能性
42
+
43
+
44
+
45
+ * カメラキャリブレーションが精度よくできていない。
46
+
47
+ * 顔検出がうまくいっていない。
48
+
49
+ * object_pts と image_pts の対応関係はあっている?object_pts を matplotlib で3Dプロット、image_pts を画像上に描画して確認
50
+
51
+ * SolvePnP() の外部パラメータ推定はうまくいっている?[こちら](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_calib3d/py_pose/py_pose.html) を参考に、xyz 軸を描画してみる。object_pts を画像上に描画してみる。

1

2018/09/28 02:44

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -11,3 +11,7 @@
11
11
  * cameraMatrix: カメラ行列
12
12
 
13
13
  * distCoeffs: 歪みパラメータ
14
+
15
+
16
+
17
+ [こちら](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_calib3d/py_pose/py_pose.html) なども参考にして、 objectPoints を画像上に描画してみてください。