質問編集履歴
4
プログラムを修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -98,7 +98,7 @@
|
|
98
98
|
|
99
99
|
return (self.mouseEvent["x"], self.mouseEvent["y"])
|
100
100
|
|
101
|
-
|
101
|
+
|
102
102
|
|
103
103
|
#取得した座標から特徴点を取得する
|
104
104
|
|
@@ -186,7 +186,7 @@
|
|
186
186
|
|
187
187
|
print(mouseData.getY())
|
188
188
|
|
189
|
-
|
189
|
+
self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
|
190
190
|
|
191
191
|
#右クリックがあったら終了
|
192
192
|
|
@@ -468,6 +468,8 @@
|
|
468
468
|
|
469
469
|
i += 1
|
470
470
|
|
471
|
+
|
472
|
+
|
471
473
|
if __name__ == '__main__':
|
472
474
|
|
473
475
|
Motion().run()
|
3
プログラムを修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -184,7 +184,9 @@
|
|
184
184
|
|
185
185
|
print(mouseData.getX())
|
186
186
|
|
187
|
+
print(mouseData.getY())
|
188
|
+
|
187
|
-
|
189
|
+
self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
|
188
190
|
|
189
191
|
#右クリックがあったら終了
|
190
192
|
|
@@ -466,6 +468,10 @@
|
|
466
468
|
|
467
469
|
i += 1
|
468
470
|
|
471
|
+
if __name__ == '__main__':
|
472
|
+
|
473
|
+
Motion().run()
|
474
|
+
|
469
475
|
```
|
470
476
|
|
471
477
|
|
2
プログラムを修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -98,7 +98,7 @@
|
|
98
98
|
|
99
99
|
return (self.mouseEvent["x"], self.mouseEvent["y"])
|
100
100
|
|
101
|
-
|
101
|
+
|
102
102
|
|
103
103
|
#取得した座標から特徴点を取得する
|
104
104
|
|
@@ -146,63 +146,11 @@
|
|
146
146
|
|
147
147
|
#特徴点(一番最初の画像で取得した特徴点)
|
148
148
|
|
149
|
-
self.features_src = None
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
#取得した座標から特徴点を取得する
|
154
|
-
|
155
|
-
class Motion:
|
156
|
-
|
157
|
-
#コンストラクタ
|
158
|
-
|
159
|
-
def __init__(self):
|
160
|
-
|
161
|
-
#表示ウィンドウ(特徴点追跡用)
|
162
|
-
|
163
|
-
cv2.namedWindow("motion")
|
164
|
-
|
165
|
-
#表示ウィンドウ(特徴点指定用)
|
166
|
-
|
167
|
-
cv2.namedWindow("input window")
|
168
|
-
|
169
|
-
#インターバル
|
170
|
-
|
171
|
-
self.interval = INTERVAL
|
172
|
-
|
173
|
-
#現在のフレーム(カラー)
|
174
|
-
|
175
|
-
self.frame = None
|
176
|
-
|
177
|
-
#現在のフレーム(グレー)
|
178
|
-
|
179
|
-
self.gray_next = None
|
180
|
-
|
181
|
-
#前回のフレーム(グレー)
|
182
|
-
|
183
|
-
self.gray_prev = None
|
184
|
-
|
185
|
-
#特徴点
|
186
|
-
|
187
|
-
self.features = None
|
188
|
-
|
189
|
-
#特徴点のステータス
|
190
|
-
|
191
|
-
self.status = None
|
192
|
-
|
193
|
-
#特徴点のステータス(一番最初の画像で取得した特徴点)
|
194
|
-
|
195
|
-
self.status_src = None
|
196
|
-
|
197
|
-
#特徴点(一番最初の画像で取得した特徴点)
|
198
|
-
|
199
149
|
self.features_src = None
|
200
150
|
|
201
151
|
#メインループ
|
202
152
|
|
203
|
-
def run(self):
|
153
|
+
def run(self):
|
204
|
-
|
205
|
-
n = 1
|
206
154
|
|
207
155
|
#最初のフレームの処理
|
208
156
|
|
1
プログラムを修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -196,23 +196,25 @@
|
|
196
196
|
|
197
197
|
#特徴点(一番最初の画像で取得した特徴点)
|
198
198
|
|
199
|
-
self.features_src = None
|
199
|
+
self.features_src = None
|
200
200
|
|
201
201
|
#メインループ
|
202
202
|
|
203
203
|
def run(self):
|
204
204
|
|
205
|
+
n = 1
|
206
|
+
|
205
207
|
#最初のフレームの処理
|
206
208
|
|
207
209
|
self.frame = cv2.imread("IMG_1.tiff")
|
208
210
|
|
209
211
|
self.gray_prev = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY)
|
210
212
|
|
211
|
-
self.gray_next = cv2.cvtColor(self.frame,cv2.COLOR_BGR2GRAY)
|
213
|
+
self.gray_next = cv2.cvtColor(self.frame,cv2.COLOR_BGR2GRAY)
|
212
214
|
|
213
215
|
#最初の特徴点10点を指定
|
214
216
|
|
215
|
-
cv2.imshow("input window",self.frame)
|
217
|
+
cv2.imshow("input window",self.frame)
|
216
218
|
|
217
219
|
#コールバックの設定
|
218
220
|
|
@@ -234,15 +236,19 @@
|
|
234
236
|
|
235
237
|
print(mouseData.getX())
|
236
238
|
|
237
|
-
print(mouseData.getY())
|
238
|
-
|
239
|
-
self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
|
239
|
+
print(mouseData.getY()) self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
|
240
|
+
|
241
|
+
#右クリックがあったら終了
|
242
|
+
|
243
|
+
elif mouseData.getEvent() == cv2.EVENT_RBUTTONDOWN:
|
244
|
+
|
245
|
+
break;
|
240
246
|
|
241
247
|
#特徴点描画と10点の特徴点を取得
|
242
248
|
|
243
249
|
if self.features is not None:
|
244
250
|
|
245
|
-
if len(self.features) >= 10:
|
251
|
+
if len(self.features) >= 10:
|
246
252
|
|
247
253
|
#オプティカルフローの計算
|
248
254
|
|
@@ -272,28 +278,30 @@
|
|
272
278
|
|
273
279
|
#有効な特徴点のみ残す
|
274
280
|
|
275
|
-
self.refreshFeatures()
|
281
|
+
self.refreshFeatures()
|
276
|
-
|
277
|
-
#最初の特徴点を格納しておく
|
278
282
|
|
279
283
|
if len(self.features) >= 10:
|
280
284
|
|
285
|
+
#最初の特徴点を格納しておく
|
286
|
+
|
281
287
|
self.status_src = self.status
|
282
288
|
|
283
289
|
self.features_src = self.features
|
284
290
|
|
285
|
-
print("特徴点10個取得出来ました")
|
291
|
+
print("特徴点10個取得出来ました")
|
286
|
-
|
292
|
+
|
287
|
-
break;
|
293
|
+
break;
|
288
294
|
|
289
295
|
#画像毎の特徴点を抽出し、追跡する
|
290
296
|
|
291
|
-
for frame in range(2,FRAME):
|
297
|
+
for frame in range(2,FRAME):
|
292
298
|
|
293
299
|
#グレースケールに変換
|
294
300
|
|
295
301
|
self.gray_next = cv2.cvtColor(self.frame,cv2.COLOR_BGR2GRAY)
|
296
302
|
|
303
|
+
#self.gray_next = self.frame
|
304
|
+
|
297
305
|
#特徴点が登録されている場合にOpticalFlowを計算
|
298
306
|
|
299
307
|
if self.features is not None:
|
@@ -322,7 +330,7 @@
|
|
322
330
|
|
323
331
|
#有効な特徴点のみ残す
|
324
332
|
|
325
|
-
self.refreshFeatures()
|
333
|
+
self.refreshFeatures()
|
326
334
|
|
327
335
|
#フレームに有効な特徴点を描画
|
328
336
|
|
@@ -330,7 +338,7 @@
|
|
330
338
|
|
331
339
|
for features in self.features:
|
332
340
|
|
333
|
-
cv2.circle(self.frame,(features[0][0],features[0][1]),2,(15,241,255),-1,8,0)
|
341
|
+
cv2.circle(self.frame,(features[0][0],features[0][1]),2,(15,241,255),-1,8,0)
|
334
342
|
|
335
343
|
#表示
|
336
344
|
|
@@ -354,6 +362,10 @@
|
|
354
362
|
|
355
363
|
#マウスクリックで特徴点を指定する
|
356
364
|
|
365
|
+
#クリックされた近傍に既存の特徴点がある場合は既存の特徴点を削除する
|
366
|
+
|
367
|
+
#クリックされた近傍に既存の特徴点がない場合は新規特徴点を追加する
|
368
|
+
|
357
369
|
def onMouse(self,x,y,XY):
|
358
370
|
|
359
371
|
#最初の特徴点追加
|
@@ -368,6 +380,8 @@
|
|
368
380
|
|
369
381
|
for click in self.features:
|
370
382
|
|
383
|
+
#print(click)
|
384
|
+
|
371
385
|
if np.all(click == XY):
|
372
386
|
|
373
387
|
return
|
@@ -440,7 +454,7 @@
|
|
440
454
|
|
441
455
|
print("feature is out of radius")
|
442
456
|
|
443
|
-
return -1
|
457
|
+
return -1
|
444
458
|
|
445
459
|
# 特徴点を新規に追加する
|
446
460
|
|
@@ -452,7 +466,7 @@
|
|
452
466
|
|
453
467
|
# ndarrayの作成し特徴点の座標を登録
|
454
468
|
|
455
|
-
self.features = np.array([[[x, y]]],
|
469
|
+
self.features = np.array([[[x, y]]],np.float32)
|
456
470
|
|
457
471
|
self.status = np.array([1])
|
458
472
|
|
@@ -472,7 +486,7 @@
|
|
472
486
|
|
473
487
|
# 特徴点を高精度化
|
474
488
|
|
475
|
-
cv2.cornerSubPix(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA)
|
489
|
+
cv2.cornerSubPix(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA)
|
476
490
|
|
477
491
|
# 有効な特徴点のみ残す
|
478
492
|
|
@@ -488,7 +502,7 @@
|
|
488
502
|
|
489
503
|
i = 0
|
490
504
|
|
491
|
-
while i < len(self.features):
|
505
|
+
while i < len(self.features):
|
492
506
|
|
493
507
|
# 特徴点として認識できず
|
494
508
|
|