回答編集履歴

9

補足

2020/07/17 15:45

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/07/17 15:45

投稿

kotori_a
kotori_a

スコア820

test CHANGED
@@ -12,17 +12,17 @@
12
12
 
13
13
  ```
14
14
 
15
- の行について、corners配列内のデータ順序は、ids配列内に格納されマーカーIDの順序と対応しているものと思われます。
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に対応する座標・位置データがprint出力されます。
63
+ とすれば、検知した各マーカーのID番号とそのIDに対応する座標・方向データが正しくprint出力されます。

7

修正

2020/07/16 23:39

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/07/16 13:47

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/07/16 13:46

投稿

kotori_a
kotori_a

スコア820

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
- いて、corners配列内のデータ順序は、ids配列内に格納されたマーカーIDの順序と対応しているものと思われます。
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

リンク修正

2020/07/16 12:07

投稿

kotori_a
kotori_a

スコア820

test CHANGED
@@ -1,6 +1,4 @@
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
-
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

参考文献を追記

2020/07/16 11:16

投稿

kotori_a
kotori_a

スコア820

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
- ここに、corners配列内のデータ順序は、ids配列内に格納されたマーカーIDの順序と対応しているものと思われます。
17
+ 於いて、corners配列内のデータ順序は、ids配列内に格納されたマーカーIDの順序と対応しているものと思われます。
8
18
 
9
19
 
10
20
 

2

修正

2020/07/16 11:15

投稿

kotori_a
kotori_a

スコア820

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ```
6
6
 
7
- ここに、cornersの中身とids配列内のidの順序対応しているものと思われます。
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

修正

2020/07/16 11:10

投稿

kotori_a
kotori_a

スコア820

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