回答編集履歴
4
あ
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
概要
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
あ
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
あ
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 を画像上に描画してみてください。
|