回答編集履歴
9
補足
test
CHANGED
@@ -61,3 +61,117 @@
|
|
61
61
|
```
|
62
62
|
|
63
63
|
とすれば、検知した各マーカーのID番号とそのIDに対応する座標・方向データが正しくprint出力されます。
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
## 補足
|
68
|
+
|
69
|
+
**[1度の処理ループの中で例えばID1とID2のマーカが同時に見えているときに、それぞれの座標、方向データをprintする方法]**
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
[参照:自作サンプルコードのリンク](https://gist.github.com/taizan-hokuto/6d3df5cf7c5fbf7d8c98933c3acae8f1)
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
まず、取得した画像フレーム中に認識されているすべてのマーカーを一度辞書(markers)に格納します。
|
78
|
+
|
79
|
+
(サンプルコードの48行目から56行目)
|
80
|
+
|
81
|
+
(辞書のキー:マーカーID、値:各マーカーの座標・方向データ)
|
82
|
+
|
83
|
+
```lang-python
|
84
|
+
|
85
|
+
if len(corners) > 0:
|
86
|
+
|
87
|
+
# マーカーごとに処理
|
88
|
+
|
89
|
+
for i, corner in enumerate(corners)
|
90
|
+
|
91
|
+
(略)
|
92
|
+
|
93
|
+
euler_angle = cv2.decomposeProjectionMatrix(proj_matrix)[6] # [deg]
|
94
|
+
|
95
|
+
# マーカーIDをキーにして、マーカーID毎の座標・方向を辞書に格納:
|
96
|
+
|
97
|
+
markers[ids[i][0]] = {
|
98
|
+
|
99
|
+
"x": str(tvec[0]),
|
100
|
+
|
101
|
+
"y": str(tvec[1]),
|
102
|
+
|
103
|
+
"z": str(tvec[2]),
|
104
|
+
|
105
|
+
"roll": str(euler_angle[0]),
|
106
|
+
|
107
|
+
"pitch": str(euler_angle[1]),
|
108
|
+
|
109
|
+
"yaw": str(euler_angle[2])
|
110
|
+
|
111
|
+
}
|
112
|
+
|
113
|
+
```
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
そして、forループが終わった後(=1画像中に認識されている複数のマーカー全部の座標・方向データを取得し終わった後)に、
|
118
|
+
|
119
|
+
座標/方向データを格納した辞書markersの内容を一括してprint出力します。
|
120
|
+
|
121
|
+
(これが「1度の処理ループの中で複数のマーカが同時に認識されているときに、それぞれの座標、方向データをprintする」ということに相当します)
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
```lang-python
|
126
|
+
|
127
|
+
# 1フレーム内にある複数マーカーの座標・方向を出力する。
|
128
|
+
|
129
|
+
if len(markers.keys()) > 0:
|
130
|
+
|
131
|
+
print('='*20)
|
132
|
+
|
133
|
+
for mid in markers.keys(): # マーカーIDを列挙
|
134
|
+
|
135
|
+
print("ID%s のマーカー=(x: %s, y: %s, z: %s, roll: %s, pitch: %s, yaw: %s)" % (
|
136
|
+
|
137
|
+
mid, markers[mid]["x"], markers[mid]["y"], markers[mid]["z"], markers[mid]["roll"], markers[mid]["pitch"], markers[mid]["yaw"]))
|
138
|
+
|
139
|
+
sys.stdout.flush()
|
140
|
+
|
141
|
+
time.sleep(0.01)
|
142
|
+
|
143
|
+
print('='*20)
|
144
|
+
|
145
|
+
```
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
```lang-
|
150
|
+
|
151
|
+
<出力結果例>
|
152
|
+
|
153
|
+
====================
|
154
|
+
|
155
|
+
ID33 のマーカー=(x: 0.37299620897877683, y: 0.27564137297074015, z: 1.110049767074254, roll: [-179.21082782], pitch: [12.49320262], yaw: [-30.8981787])
|
156
|
+
|
157
|
+
ID303 のマーカー=(x: 0.06045913651229322, y: 0.09409733040784415, z: 0.37885871558283024, roll: [165.96844965], pitch: [11.57957246], yaw: [-32.58198751])
|
158
|
+
|
159
|
+
====================
|
160
|
+
|
161
|
+
====================
|
162
|
+
|
163
|
+
ID33 のマーカー=(x: 0.3782612414418004, y: 0.2739673617455094, z: 1.117224765870064, roll: [141.8837889], pitch: [8.68655973], yaw: [-30.71523192])
|
164
|
+
|
165
|
+
ID303 のマーカー=(x: 0.059853849602700245, y: 0.09263841265615678, z: 0.37457827584934494, roll: [166.37149935], pitch: [13.71420176], yaw: [-33.21705198])
|
166
|
+
|
167
|
+
====================
|
168
|
+
|
169
|
+
```
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
出力結果例で、「============」で囲まれている範囲それぞれが、各々の時点で同時に認識されているマーカーのデータになります。
|
176
|
+
|
177
|
+
(上記の出力結果では、ID33とID303のマーカーが同時に認識されていることを示しています)
|
8
修正
test
CHANGED
@@ -12,17 +12,17 @@
|
|
12
12
|
|
13
13
|
```
|
14
14
|
|
15
|
-
の行について、corners配列内のデータ順序は、ids配列内に格納され
|
15
|
+
の行について、(この関数を呼び出したときに返ってくる)corners配列内のデータ順序は、同ids配列内に格納されているマーカーIDの順序と対応しているものと思われます。
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
具体的には、
|
19
|
+
具体的には、この関数を呼び出す毎に返ってくる
|
20
20
|
|
21
21
|
ids[0,1,2,...n] と
|
22
22
|
|
23
23
|
corners[0,1,2,...n]
|
24
24
|
|
25
|
-
について
|
25
|
+
について、常に
|
26
26
|
|
27
27
|
|
28
28
|
|
@@ -60,4 +60,4 @@
|
|
60
60
|
|
61
61
|
```
|
62
62
|
|
63
|
-
とすれば、検知した各マーカーのID番号とそのIDに対応する座標・
|
63
|
+
とすれば、検知した各マーカーのID番号とそのIDに対応する座標・方向データが正しくprint出力されます。
|
7
修正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[公式ドキュメント](https://docs.opencv.org/master/d9/d6a/group__aruco.html#gab9159aa69250d8d3642593e508cb6baa)で
|
1
|
+
detectMarkers関数について、[公式ドキュメント](https://docs.opencv.org/master/d9/d6a/group__aruco.html#gab9159aa69250d8d3642593e508cb6baa)で
|
2
2
|
|
3
3
|
> For each detected marker, it returns the 2D position of its corner in the image and its corresponding identifier.
|
4
4
|
|
6
修正
test
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
よって、
|
45
|
+
よって、たとえば
|
46
46
|
|
47
47
|
```
|
48
48
|
|
@@ -60,4 +60,4 @@
|
|
60
60
|
|
61
61
|
```
|
62
62
|
|
63
|
-
とすれば
|
63
|
+
とすれば、検知した各マーカーのID番号とそのIDに対応する座標・位置データがprint出力されます。
|
5
修正
test
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
[公式ドキュメント](https://docs.opencv.org/master/d9/d6a/group__aruco.html#gab9159aa69250d8d3642593e508cb6baa)
|
1
|
+
[公式ドキュメント](https://docs.opencv.org/master/d9/d6a/group__aruco.html#gab9159aa69250d8d3642593e508cb6baa)で
|
2
2
|
|
3
3
|
> For each detected marker, it returns the 2D position of its corner in the image and its corresponding identifier.
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
と
|
7
|
+
と説明されていることから、
|
8
8
|
|
9
9
|
```
|
10
10
|
|
@@ -12,19 +12,25 @@
|
|
12
12
|
|
13
13
|
```
|
14
14
|
|
15
|
-
に
|
15
|
+
の行について、corners配列内のデータ順序は、ids配列内に格納されたマーカーIDの順序と対応しているものと思われます。
|
16
16
|
|
17
17
|
|
18
18
|
|
19
19
|
具体的には、
|
20
20
|
|
21
|
+
ids[0,1,2,...n] と
|
22
|
+
|
21
23
|
corners[0,1,2,...n]
|
22
24
|
|
23
25
|
について
|
24
26
|
|
25
|
-
マーカーID:ids[0] の 頂点データはcorners[0]
|
26
27
|
|
28
|
+
|
29
|
+
マーカーID:ids[0] の 頂点データは corners[0]
|
30
|
+
|
27
|
-
マーカーID:ids[1] の 頂点データはcorners[1]
|
31
|
+
マーカーID:ids[1] の 頂点データは corners[1]
|
32
|
+
|
33
|
+
・・・
|
28
34
|
|
29
35
|
・・・
|
30
36
|
|
@@ -32,7 +38,7 @@
|
|
32
38
|
|
33
39
|
|
34
40
|
|
35
|
-
に格納されていると思われます。
|
41
|
+
という風に格納されていると思われます。
|
36
42
|
|
37
43
|
|
38
44
|
|
4
リンク修正
test
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
[公式ドキュメント](
|
1
|
+
[公式ドキュメント](https://docs.opencv.org/master/d9/d6a/group__aruco.html#gab9159aa69250d8d3642593e508cb6baa)にある
|
2
|
-
|
3
|
-
にある
|
4
2
|
|
5
3
|
> For each detected marker, it returns the 2D position of its corner in the image and its corresponding identifier.
|
6
4
|
|
3
参考文献を追記
test
CHANGED
@@ -1,10 +1,20 @@
|
|
1
|
+
[公式ドキュメント]( https://docs.opencv.org/master/d9/d6a/group__aruco.html#gab9159aa69250d8d3642593e508cb6baa)
|
2
|
+
|
3
|
+
にある
|
4
|
+
|
5
|
+
> For each detected marker, it returns the 2D position of its corner in the image and its corresponding identifier.
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
という説明から推察するに
|
10
|
+
|
1
11
|
```
|
2
12
|
|
3
13
|
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)
|
4
14
|
|
5
15
|
```
|
6
16
|
|
7
|
-
|
17
|
+
に於いて、corners配列内のデータ順序は、ids配列内に格納されたマーカーIDの順序と対応しているものと思われます。
|
8
18
|
|
9
19
|
|
10
20
|
|
2
修正
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
```
|
6
6
|
|
7
|
-
ここに、cornersの
|
7
|
+
ここに、corners配列内のデータ順序は、ids配列内に格納されたマーカーIDの順序と対応しているものと思われます。
|
8
8
|
|
9
9
|
|
10
10
|
|
@@ -14,13 +14,13 @@
|
|
14
14
|
|
15
15
|
について
|
16
16
|
|
17
|
-
ids[0] の 頂点データはcorners[0]
|
17
|
+
マーカーID:ids[0] の 頂点データはcorners[0]
|
18
18
|
|
19
|
-
ids[1] の 頂点データはcorners[1]
|
19
|
+
マーカーID:ids[1] の 頂点データはcorners[1]
|
20
20
|
|
21
21
|
・・・
|
22
22
|
|
23
|
-
ids[n] の 頂点データはcorners[n]
|
23
|
+
マーカーID:ids[n] の 頂点データはcorners[n]
|
24
24
|
|
25
25
|
|
26
26
|
|
1
修正
test
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
|
-
具体的には、
|
11
|
+
具体的には、
|
12
12
|
|
13
13
|
corners[0,1,2,...n]
|
14
14
|
|