DataTennis.NET

データテニスドットネット

【OpenCVを使ったスポーツ画像解析5】画像からテニス選手の位置を検出する

公開日:
最終更新日:2018/07/27

      2018/07/27

モーショントラッキングの続きです。

【OpenCVを使ったスポーツ画像解析1】テニス選手の移動量や軌跡をデータ化するでは、選手の動きをトラッキングしましたが、
最初の位置(バウンディングボックスの初期位置)は自分で指定する必要がありました。
そこで、【OpenCVを使ったスポーツ画像解析3】選手やテニスボールの移動を自動で検出して移動軌跡をトラッキング
で、動画の各フレームの差分から動いているものを検出し、初期位置をみつけてからトラッキングするようにしました。

しかし、ボールとの区別をつけるために膨張処理を施す必要があったり、細かい調整を必要とするため、いろんな動画に対応させることが難しそうです。

そこで、別の手法で初期位置を自動検出できないかを、ネットで調べながらいろいろやっているところです。
調べた中の1つの手法、HOG特徴量とSVM(サポートベクターマシン)を組み合わせた手法を用いて選手検出をやってみました。

OpenCVでは、人物検出用のデータセットで学習したモデルを、

hog.setSVMDetector(cv2.HOGDescriptor_getDaimlerPeopleDetector())

で呼び出すことができます。

実施した結果が↓になります。

(2018/4/26)申し訳ありません。画像は削除しました。

人物をちゃんと検出できていることがわかります。

ただ、選手2人以外にも、ボールパーソンや審判なども検出されてしまうんですよね。
そのあとの移動量が大きい物体のみトラッキングするようにしてうまく対応したいところです。

今現在は、深層学習(ディープラーニング)を使って精度よく自動で選手を検出できないかを試しているところです。
そのあたりの進捗があったらまた紹介します。

スポーツ画像解析リンク
・【OpenCVを使ったスポーツ画像解析1】テニス選手の移動量や軌跡をデータ化する
・【OpenCVを使ったスポーツ画像解析2】フェデラー選手の移動軌跡をグラフ化してみました
・【OpenCVを使ったスポーツ画像解析3】選手やテニスボールの移動を自動で検出して移動軌跡をトラッキング
・【OpenCVを使ったスポーツ画像解析4】テニスコートのラインの自動検出
・【OpenCVを使ったスポーツ画像解析5】画像からテニス選手の位置を検出する
・【OpenCVを使ったスポーツ画像解析6】深層学習(ディープラーニング)を用いてテニス選手とボールをトラッキング

↓がpythonコードになります。

import numpy as np
import cv2
import sys
import os

directory="C:/Users/test/Documents/Python/opencv/image/"
files = os.listdir(directory)

for file in files:
    wname=file
    Image=cv2.imread(directory+file,1)
    
    hog = cv2.HOGDescriptor()
    hog = cv2.HOGDescriptor((48,96), (16,16), (8,8), (8,8), 9)

    # SVMによる人検出
    hog.setSVMDetector(cv2.HOGDescriptor_getDaimlerPeopleDetector())
    hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
    
    finalHeight = 800.0
    scale = finalHeight / Image.shape[0]
    Image = cv2.resize(Image, None, fx=scale, fy=scale)

    # 人を検出した座標
    human, r = hog.detectMultiScale(Image, hitThreshold = 0.6, winStride = (8,8), padding = (32, 32), scale = 1.05,finalThreshold=2)

    # 全員のバウンディングボックスを作成
    for (x, y, w, h) in human:
        cv2.rectangle(Image, (x, y),(x+w, y+h),(0,255,0), 2)

    # 人を検出した座標
    cv2.imshow("Image",Image)
    cv2.waitKey(0)    

 - blog, スポーツ画像解析, データ分析