###前提・実現したいこと
こんにちは。
https://youtu.be/CBXrsAJOKhQ
こちらのテニスシーンの映像においてラベリング処理をBackgroundSubtractorMOG
と組み合わせて行い、
面積の大きいもの(選手2名)のみを表示する機能を実装したいと考えております。
https://teratail.com/questions/46863
上記の回答者様のご意見を参考にプログラムを組んでみたのですが、
ウィンドウが真っ暗な画面となってしまいます。(画像1枚のラベリングは可能でした。)
膨大な処理を行う関係上、
映像においてのラベリング処理は不可能なのでしょうか。
よろしくお願いします。
###発生している問題
実行を「CTRL+C」で終了してみると、 毎回この部分の処理に時間がかかっていることがわかりました。 for index in range(len(dst)): if dst[index] == max_index: dst[index] = 255; else: dst[index] = 0;
###該当のソースコード
python
1import numpy as np 2import cv2 3import sys 4 5param = sys.argv 6kernel = np.ones((5, 5), np.uint8) 7 8cap = cv2.VideoCapture('tennis.mp4') 9 10t=0 11 12while(1): 13 ret, frame = cap.read() 14 15 if t==183: ##映像の長さにあわせて終了 16 break 17 18################################################################### 19#ラべリング用に追加 20 src=frame 21 src = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) 22 height, width = src.shape[:2] 23 24 ret, src = cv2.threshold(src, 105, 255, cv2.THRESH_BINARY) 25 label = cv2.connectedComponentsWithStats(cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)) 26 27# 2次元ままだと何かと処理しづらいので1次元に落とす 28 dst = label[1].reshape((-1)) 29 30# 背景を除いて1番大きいラベルのみを白にし、その他を黒とする 31 data = np.delete(label[2], 0, 0) 32 max_index = np.argsort(data[:,4])[::-1][0] + 1 33 for index in range(len(dst)): 34 if dst[index] == max_index: 35 dst[index] = 255; 36 else: 37 dst[index] = 0; 38 39# 2次元に戻して画像として出力 40 dst = dst.reshape((height, width)) 41################################################################### 42 43 cv2.imshow('tennis',dst) 44 t = t+1 45 46 k = cv2.waitKey(30) & 0xff 47 if k == 27: 48 break 49 50cap.release() 51cv2.destroyAllWindows()
###補足情報(言語/FW/ツール等のバージョンなど)
ASUS ZenBook™ 3 UX390UA-256G
インテルCore™ i5-7200U プロセッサー 2.5GHz メモリ8GB
を使用しております。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/10/26 13:41