DataTennis. NET

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

【OpenCVを使ったスポーツ画像解析3(モーショントラッキング)】選手やテニスボールの移動を自動で検出して移動軌跡をトラッキング

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

      2018/07/27

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

先回【モーショントラッキング2】フェデラー選手の移動軌跡をグラフ化してみましたでは、選手の動きをトラッキングしましたが、
最初の位置は自分で指定する必要がありました。ポイントごとに毎回初期位置を設定するのは結構な手間になります。

ということで、今回は動画から動いているものを検出して、初期位置をみつけてからトラッキングできるようにしようかと思います。

そして、選手の動きだけでなく、ボールの軌道も検出できるようにします。

解析した動画は↓のようになります。
動いているものだけを検出できるように白黒画像(2値化)に変換されています。
(元動画は、【モーショントラッキング】テニス選手の移動量や軌跡をデータ化するでご覧になってください。)

静止画ではこんな感じになります。

ballTrack

選手の動きとボールの軌跡をうまくトラッキングできていることがわかります。
どうやってやったかについて説明しましょう。

まずは、前の画像と今の画像との差分画像を作成し、動いているもの(選手やボール)を検出できるようにします。

差分画像は↓のようになります。
color_diff

うっすらとですが、選手とボールが表示されていることがわかります。
次に検出した画像を2値化(白黒画像に変換)し、findContoursを用いて輪郭検出を行いますが、選手が複数の物体に分けて検出されてしまうという問題がでてきます。
notdilation

そこで、2値化画像に、追加で膨張処理を施すことで分割された領域をくっつけます。↓のような画像に変換されます。
dilation

これで、選手2人とボールを検出することができます。

あと、ボールと選手、そしてそれ以外のノイズをちゃんと分けて検出できるように、以下の条件分岐を施してます。
①ボールと選手を分けて検出するために、輪郭内の面積を計算し面積が1000以上かどうかで、ボールと選手を判別しています。
②コート外のボールパーソンやライン審判の移動も検出されてしまわないよう、コートの中にある場合だけ、ボールとして判定します。
③奥の選手と前の選手を分けて検出するために、y座標が185より小さい座標は奥の選手、大きい座標は手前の選手として検出します。

と、こんな感じで、差分画像から移動しているものを抽出し、少しの判定処理で選手とボールの移動をトラッキングできるようにしました。

選手だけでなく、ボールもトラッキングできるようにしたので、動画からボールのコースやネットミス、どちらの選手がどういうポイントの取り方をしたのか、とかいろいろ解析できることが増えそうです。

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

コード(python+opencv)は↓に記載しています。

 - blog, スポーツ画像解析, データ分析, テニス×テクノロジー