質問編集履歴

2

画像貼り付け位置修正

2018/01/21 07:19

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,275 @@
1
+ 前提・実現したいこと
2
+
3
+ 移動しているボール(ジャグリングなど)を検出して円を描くプログラムです。OpenCVで移動体検出を使ったサンプルをいくつかつなぎ合わせたハリボテプログラムなので、余計な部分があるかもしれませんが、あまり気にしないでいただけると……
4
+
5
+ 実現したいこととしては、
6
+
7
+ ①余計に表示されてしまっている円をボール上だけにしたいこと(円の数を減らしたい)
8
+
9
+ ②加えてボールの軌跡を描くこと(軌跡の描き方は分かっているのですが、それぞれのボール(円)ごとに区別するやりかたがわかりません)
10
+
11
+ の二つです。
12
+
13
+ どうかよろしくお願い致します。
14
+
15
+
16
+
17
+ ###該当のソースコード
18
+
19
+ ```
20
+
21
+ import cv2
22
+
23
+ import numpy as np
24
+
25
+ from collections import deque
26
+
27
+ import argparse
28
+
29
+ import math
30
+
31
+
32
+
33
+ kernel = np.ones((5,5),np.uint8)
34
+
35
+
36
+
37
+ neiborhood4 = np.array([[1, 1, 1],
38
+
39
+ [1, 1, 1],
40
+
41
+ [1, 1, 1]],
42
+
43
+ np.uint8)
44
+
45
+
46
+
47
+ ap = argparse.ArgumentParser()
48
+
49
+ ap.add_argument("-v", "--video",
50
+
51
+ help="path to the (optional) video file")
52
+
53
+ ap.add_argument("-b", "--buffer", type=int, default=10,
54
+
55
+ help="max buffer size")
56
+
57
+ args = vars(ap.parse_args())
58
+
59
+
60
+
61
+ # フレーム差分の計算
62
+
63
+ def frame_sub(src1, src2, src3, th):
64
+
65
+ # フレームの絶対差分
66
+
67
+ d1 = cv2.absdiff(src1, src2)
68
+
69
+ d2 = cv2.absdiff(src2, src3)
70
+
71
+
72
+
73
+ # 2つの差分画像の論理積
74
+
75
+ diff = cv2.bitwise_and(d1, d2)
76
+
77
+
78
+
79
+ # 二値化処理
80
+
81
+ diff[diff < th] = 0
82
+
83
+ diff[diff >= th] = 255
84
+
85
+
86
+
87
+ # メディアンフィルタ処理(ゴマ塩ノイズ除去)
88
+
89
+ mask = cv2.medianBlur(diff, 3)
90
+
91
+
92
+
93
+ return mask
94
+
95
+
96
+
97
+ def main():
98
+
99
+
100
+
101
+ pts1 = deque(maxlen=args["buffer"])
102
+
103
+ # カメラのキャプチャ
104
+
105
+ cap = cv2.VideoCapture("動画ファイル")
106
+
107
+
108
+
109
+ cv2.namedWindow("Frame2",cv2.WINDOW_NORMAL)
110
+
111
+ cv2.namedWindow("Douga",cv2.WINDOW_NORMAL)
112
+
113
+
114
+
115
+
116
+
117
+ # フレームを3枚取得してグレースケール変換
118
+
119
+ frame1 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
120
+
121
+ #frame2 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
122
+
123
+
124
+
125
+
126
+
127
+ frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
128
+
129
+
130
+
131
+
132
+
133
+ while True:
134
+
135
+ #(grabbed, frame) = cap.read()
136
+
137
+ count=0
138
+
139
+ frame2_rgb = cap.read()[1]
140
+
141
+ frame2 = cv2.cvtColor(frame2_rgb, cv2.COLOR_RGB2GRAY)
142
+
143
+ #if not grabbed:
144
+
145
+ # break
146
+
147
+
148
+
149
+ # フレーム間差分を計算
150
+
151
+ mask = frame_sub(frame1, frame2, frame3, th=30)
152
+
153
+ #太くして面積を広く
154
+
155
+ mask = cv2.dilate(mask,neiborhood4,iterations = 1)
156
+
157
+ #輪郭の取得
158
+
159
+ image, cnts, hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
160
+
161
+
162
+
163
+ center=None
164
+
165
+
166
+
167
+ if len(cnts) > 0:
168
+
169
+ for i, contour in enumerate(cnts):
170
+
171
+
172
+
173
+ # area:面積
174
+
175
+ area = cv2.contourArea(contour)
176
+
177
+ if area < 100:
178
+
179
+ continue
180
+
181
+
182
+
183
+ # moments:重心
184
+
185
+ M = cv2.moments(contour)
186
+
187
+ if M["m00"] != 0:
188
+
189
+ cx = int(M["m10"] / M["m00"])
190
+
191
+ cy = int(M["m01"] / M["m00"])
192
+
193
+ else:
194
+
195
+ cx, cy = 0, 0
196
+
197
+
198
+
199
+ # 最小外接円
200
+
201
+ (x, y), radius = cv2.minEnclosingCircle(contour)
202
+
203
+ center = (int(x),int(y))
204
+
205
+ radius = int(radius)
206
+
207
+ frame2_rgb = cv2.circle(frame2_rgb,center,radius,(255,255,0),2)
208
+
209
+ pts1.appendleft(center)
210
+
211
+
212
+
213
+ count=count+1
214
+
215
+
216
+
217
+
218
+
219
+ # 結果を表示
220
+
221
+ cv2.imshow("Frame2", frame2)
222
+
223
+ cv2.imshow("Mask", mask)
224
+
225
+ cv2.imshow("Douga",frame2_rgb)
226
+
227
+ print(count)
228
+
229
+
230
+
231
+ # 3枚のフレームを更新
232
+
233
+ frame1 = frame2
234
+
235
+ frame2 = frame3
236
+
237
+ frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
238
+
239
+ # qキーが押されたら途中終了
240
+
241
+ key = cv2.waitKey(50) & 0xFF
242
+
243
+ if key == ord("q"):
244
+
245
+ break
246
+
247
+ cap.release()
248
+
249
+ cv2.destroyAllWindows()
250
+
251
+
252
+
253
+ if __name__ == '__main__':
254
+
255
+ main()
256
+
257
+ ```
258
+
259
+
260
+
261
+ ###試したこと
262
+
263
+ 試しに、軌跡を描くプログラムを追加してみたのですが、中心の位置が区別できていないため、あっちこっちにぶれて描かれてしまいました。
264
+
265
+
266
+
267
+ ###補足情報(言語/FW/ツール等のバージョンなど)
268
+
269
+ windows7/Anaconda3.4.4/Spyder3(Python3.5)/OpenCV 3.1.0
270
+
271
+
272
+
1
273
  ![イメージ説明](5039112873ce93078c02b430ed212b43.jpeg)
2
274
 
3
275
  ![イメージ説明](efdc0c28634400993c749ea6404c7d6f.jpeg)
@@ -9,273 +281,3 @@
9
281
  ![イメージ説明](a2a4aeecc5bc3fede5b2d134142516d7.jpeg)
10
282
 
11
283
  ![イメージ説明](0c5661bc06a07e54c047da1cf0530368.jpeg)
12
-
13
- 前提・実現したいこと
14
-
15
- 移動しているボール(ジャグリングなど)を検出して円を描くプログラムです。OpenCVで移動体検出を使ったサンプルをいくつかつなぎ合わせたハリボテプログラムなので、余計な部分があるかもしれませんが、あまり気にしないでいただけると……
16
-
17
- 実現したいこととしては、
18
-
19
- ①余計に表示されてしまっている円をボール上だけにしたいこと(円の数を減らしたい)
20
-
21
- ②加えてボールの軌跡を描くこと(軌跡の描き方は分かっているのですが、それぞれのボール(円)ごとに区別するやりかたがわかりません)
22
-
23
- の二つです。
24
-
25
- どうかよろしくお願い致します。
26
-
27
-
28
-
29
- ###該当のソースコード
30
-
31
- ```
32
-
33
- import cv2
34
-
35
- import numpy as np
36
-
37
- from collections import deque
38
-
39
- import argparse
40
-
41
- import math
42
-
43
-
44
-
45
- kernel = np.ones((5,5),np.uint8)
46
-
47
-
48
-
49
- neiborhood4 = np.array([[1, 1, 1],
50
-
51
- [1, 1, 1],
52
-
53
- [1, 1, 1]],
54
-
55
- np.uint8)
56
-
57
-
58
-
59
- ap = argparse.ArgumentParser()
60
-
61
- ap.add_argument("-v", "--video",
62
-
63
- help="path to the (optional) video file")
64
-
65
- ap.add_argument("-b", "--buffer", type=int, default=10,
66
-
67
- help="max buffer size")
68
-
69
- args = vars(ap.parse_args())
70
-
71
-
72
-
73
- # フレーム差分の計算
74
-
75
- def frame_sub(src1, src2, src3, th):
76
-
77
- # フレームの絶対差分
78
-
79
- d1 = cv2.absdiff(src1, src2)
80
-
81
- d2 = cv2.absdiff(src2, src3)
82
-
83
-
84
-
85
- # 2つの差分画像の論理積
86
-
87
- diff = cv2.bitwise_and(d1, d2)
88
-
89
-
90
-
91
- # 二値化処理
92
-
93
- diff[diff < th] = 0
94
-
95
- diff[diff >= th] = 255
96
-
97
-
98
-
99
- # メディアンフィルタ処理(ゴマ塩ノイズ除去)
100
-
101
- mask = cv2.medianBlur(diff, 3)
102
-
103
-
104
-
105
- return mask
106
-
107
-
108
-
109
- def main():
110
-
111
-
112
-
113
- pts1 = deque(maxlen=args["buffer"])
114
-
115
- # カメラのキャプチャ
116
-
117
- cap = cv2.VideoCapture("動画ファイル")
118
-
119
-
120
-
121
- cv2.namedWindow("Frame2",cv2.WINDOW_NORMAL)
122
-
123
- cv2.namedWindow("Douga",cv2.WINDOW_NORMAL)
124
-
125
-
126
-
127
-
128
-
129
- # フレームを3枚取得してグレースケール変換
130
-
131
- frame1 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
132
-
133
- #frame2 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
134
-
135
-
136
-
137
-
138
-
139
- frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
140
-
141
-
142
-
143
-
144
-
145
- while True:
146
-
147
- #(grabbed, frame) = cap.read()
148
-
149
- count=0
150
-
151
- frame2_rgb = cap.read()[1]
152
-
153
- frame2 = cv2.cvtColor(frame2_rgb, cv2.COLOR_RGB2GRAY)
154
-
155
- #if not grabbed:
156
-
157
- # break
158
-
159
-
160
-
161
- # フレーム間差分を計算
162
-
163
- mask = frame_sub(frame1, frame2, frame3, th=30)
164
-
165
- #太くして面積を広く
166
-
167
- mask = cv2.dilate(mask,neiborhood4,iterations = 1)
168
-
169
- #輪郭の取得
170
-
171
- image, cnts, hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
172
-
173
-
174
-
175
- center=None
176
-
177
-
178
-
179
- if len(cnts) > 0:
180
-
181
- for i, contour in enumerate(cnts):
182
-
183
-
184
-
185
- # area:面積
186
-
187
- area = cv2.contourArea(contour)
188
-
189
- if area < 100:
190
-
191
- continue
192
-
193
-
194
-
195
- # moments:重心
196
-
197
- M = cv2.moments(contour)
198
-
199
- if M["m00"] != 0:
200
-
201
- cx = int(M["m10"] / M["m00"])
202
-
203
- cy = int(M["m01"] / M["m00"])
204
-
205
- else:
206
-
207
- cx, cy = 0, 0
208
-
209
-
210
-
211
- # 最小外接円
212
-
213
- (x, y), radius = cv2.minEnclosingCircle(contour)
214
-
215
- center = (int(x),int(y))
216
-
217
- radius = int(radius)
218
-
219
- frame2_rgb = cv2.circle(frame2_rgb,center,radius,(255,255,0),2)
220
-
221
- pts1.appendleft(center)
222
-
223
-
224
-
225
- count=count+1
226
-
227
-
228
-
229
-
230
-
231
- # 結果を表示
232
-
233
- cv2.imshow("Frame2", frame2)
234
-
235
- cv2.imshow("Mask", mask)
236
-
237
- cv2.imshow("Douga",frame2_rgb)
238
-
239
- print(count)
240
-
241
-
242
-
243
- # 3枚のフレームを更新
244
-
245
- frame1 = frame2
246
-
247
- frame2 = frame3
248
-
249
- frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
250
-
251
- # qキーが押されたら途中終了
252
-
253
- key = cv2.waitKey(50) & 0xFF
254
-
255
- if key == ord("q"):
256
-
257
- break
258
-
259
- cap.release()
260
-
261
- cv2.destroyAllWindows()
262
-
263
-
264
-
265
- if __name__ == '__main__':
266
-
267
- main()
268
-
269
- ```
270
-
271
-
272
-
273
- ###試したこと
274
-
275
- 試しに、軌跡を描くプログラムを追加してみたのですが、中心の位置が区別できていないため、あっちこっちにぶれて描かれてしまいました。
276
-
277
-
278
-
279
- ###補足情報(言語/FW/ツール等のバージョンなど)
280
-
281
- windows7/Anaconda3.4.4/Spyder3(Python3.5)/OpenCV 3.1.0

1

動画の数フレームを貼り付けました。動かすにあたっての動画の指定は、ボールが2・3個動いていればいいので、そこまで限定していません。

2018/01/21 07:19

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,16 @@
1
+ ![イメージ説明](5039112873ce93078c02b430ed212b43.jpeg)
2
+
3
+ ![イメージ説明](efdc0c28634400993c749ea6404c7d6f.jpeg)
4
+
5
+ ![イメージ説明](21217e012841a47ea32550c9c4be0c54.jpeg)
6
+
7
+ ![イメージ説明](4e5ac9ba782b941d764515d71dfd0ccc.jpeg)
8
+
9
+ ![イメージ説明](a2a4aeecc5bc3fede5b2d134142516d7.jpeg)
10
+
11
+ ![イメージ説明](0c5661bc06a07e54c047da1cf0530368.jpeg)
12
+
1
- ###前提・実現したいこと
13
+ 前提・実現したいこと
2
14
 
3
15
  移動しているボール(ジャグリングなど)を検出して円を描くプログラムです。OpenCVで移動体検出を使ったサンプルをいくつかつなぎ合わせたハリボテプログラムなので、余計な部分があるかもしれませんが、あまり気にしないでいただけると……
4
16