質問編集履歴

1

エラーメッセージを追加しました。

2021/07/14 11:22

投稿

gigagiga64
gigagiga64

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,34 +1,120 @@
1
- 以前こち
1
+ 下記の画像か青色の矢印の座標を特定し、最小の円を描画するソフトを作りました。
2
2
 
3
- https://teratail.com/questions/336825
3
+ その円の中心座標と半径をcsvに保存したいのですが、以下のようなエラーが出ます。
4
4
 
5
- の質問で、プレイヤーの中心座標から最小の円求め、その円の中心座標と半径を描画できるようなソフトを作りましたが、急遽csvで記録したいと思い質問をさせていただきす。
5
+ 改善点教えていただきたいです。
6
6
 
7
7
  ![イメージ説明](bb7287c3317c4e6ef9b637df64b4965b.png)
8
8
 
9
- 画像の青色の三角形の座標を取得し、円を描画するプログラムは
9
+ ![イメージ説明](ce2bd1bec88f47f83a21c04103b6af38.png)
10
+
11
+
12
+
13
+
10
14
 
11
15
  ```Python
12
16
 
17
+ # -*- coding:utf-8 -*-
18
+
19
+ import cv2
20
+
21
+ import numpy as np
22
+
23
+ import sys
24
+
25
+
26
+
27
+
28
+
29
+
30
+
13
- #
31
+ # 青色の検出
32
+
33
+ def detect_blue_color(img):
34
+
35
+ # HSV色空間に変換
36
+
37
+ hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
38
+
39
+
40
+
41
+ # 青色のHSVの値域1
42
+
43
+ hsv_min = np.array([40,140,120])
44
+
45
+ hsv_max = np.array([150,255,255])
46
+
47
+
48
+
49
+ # 青色領域のマスク(255:赤色、0:赤色以外)
50
+
51
+ mask = cv2.inRange(hsv, hsv_min, hsv_max)
52
+
53
+
54
+
55
+ # マスキング処理
56
+
57
+ masked_img = cv2.bitwise_and(img, img, mask=mask)
58
+
59
+
60
+
61
+ return mask, masked_img
62
+
63
+
64
+
65
+ for i in range(2, 35):
66
+
67
+ img = cv2.imread('CoD1/filename_{0:05d}.png'.format(i))
68
+
69
+
70
+
71
+ # 色検出(赤、緑、青)
72
+
73
+ mask, masked_img = detect_blue_color(img)
74
+
75
+
76
+
77
+ # 輪郭を抽出する。
78
+
79
+ contours, hierarchy = cv2.findContours(
80
+
81
+ mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
82
+
83
+ )
84
+
85
+
86
+
87
+ # 小さい輪郭は誤検出として削除する
88
+
89
+ contours = list(filter(lambda x: cv2.contourArea(x) > 10, contours))
90
+
91
+
14
92
 
15
93
 
16
94
 
17
95
  def get_center(contour):
18
96
 
97
+ """輪郭の中心を取得する。
19
98
 
99
+ """
20
100
 
21
- #
101
+ # 輪郭のモーメントを計算する。
102
+
103
+ M = cv2.moments(contour)
104
+
105
+ # モーメントから重心を計算する。
106
+
107
+ cx = M["m10"] / M["m00"]
108
+
109
+ cy = M["m01"] / M["m00"]
22
110
 
23
111
 
24
112
 
25
- #return cx, 127-cy
113
+ return cx, cy
26
-
27
- return cx, cy # 修正
28
114
 
29
115
 
30
116
 
31
- # 輪郭の中心を取り出す。
117
+ # 輪郭の中心を取り出す。
32
118
 
33
119
  centers = [get_center(x) for x in contours]
34
120
 
@@ -52,26 +138,30 @@
52
138
 
53
139
  print(x,y,radius) # 中心座標と半径
54
140
 
141
+
55
142
 
56
143
 
57
- # 描画
58
144
 
59
- img = cv2.circle( img, (int(x), int(y)), int(radius), (255,0,0), 1)
145
+ # 結果を CSV で保存する。
60
146
 
61
- cv2.imwrite( 'ret.png', img)
147
+ with open('centers2.csv','a') as f_handle:
148
+
149
+ np.savetxt(f_handle, (x,y), radius , delimiter=",", fmt="%.0f")
62
150
 
63
151
  ```
64
152
 
65
153
 
66
154
 
67
- 結果は
155
+ エラーコード
68
156
 
69
- ![イメージ説明](ce2bd1bec88f47f83a21c04103b6af38.png)
157
+ 96.0 93.0 9.999999747378752e-05
70
158
 
71
- のようになります。
159
+ Traceback (most recent call last):
72
160
 
161
+ File "Blue.py", line 67, in <module>
73
162
 
163
+ np.savetxt(f_handle, (x,y), radius , delimiter=",", fmt="%.0f")
74
164
 
75
- この円の中心座標と半径をcsvファイルに保存するにはどうしたら良いでしょうか。
165
+ File "<__array_function__ internals>", line 4, in savetxt
76
166
 
77
- また、1枚の画像で取れるようになったらfor文で繰り返して複数枚に対して取るつもりです。
167
+ TypeError: _savetxt_dispatcher() got multiple values for argument 'fmt'