DataTennis.NET

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

【OpenCVを使ったスポーツ画像解析2(モーショントラッキング)】フェデラー選手の移動軌跡をグラフ化してみました

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

      2018/07/27

先回、【OpenCVを使ったスポーツ画像解析1(モーショントラッキング)】テニス選手の移動量や軌跡をデータ化する
にて、選手(フェデラー)の動きをトラッキングする様子を動画で説明しました。

バウンディングボックスで選手をトラッキングしていますが、その重心の移動を軌跡データとして描画した動画が↓になります。

トラッキングデータである移動軌跡をグラフ上にプロットしてみます。

赤丸の位置をスタート位置として、そのあとの移動軌跡が描けていることがわかります。

tracking1

グラフの軸の単位はpixelになっており、これをmに変換する必要があるのと、遠近補正を施す必要があります。
斜め上から撮影した動画になっていますが、遠近補正で真上から見た画像に変換します。

遠近補正にはホモグラフィ変換という変換法を使用しました。
opencvでは、findHomographyという関数を使用することで、台形から長方形へと遠近補正することができます。

pixelからmへの単位変換は、テニスコートのサイズは、縦23.8m 横 8.23mとなるので、縦2380 横823の長方形に変換しました。

tracking11

軌跡が描けたので、次は移動距離を計算したいと思います。

見やすくするために、移動軌跡を拡大します。

tracking13

移動距離は点間距離の合計値を総移動距離としています。
この場合、総移動距離は1989=19.9mとなりました。

動画を見ればわかりますが、このポイントでは19.9mも動いていませんよね。
これは、
・サーブを打っているときの移動量が大きくでてしまう(フォームモーションの影響?)
・0.03s(30fps)毎にデータ取得しているので、細かいノイズがのってしまう
の2点の影響で、実際の移動量よりも大きい移動量が算出されていると考えられます。

なので、今回は、
・サーブの時間帯(0~80フレーム)は省く
・0.3s(3fps)でデータ取得と間隔を大きくする
ことで、実際の移動距離に近づける作業をしました。

サーブの時間帯(0~80フレーム)を省いた軌跡データをみてみましょう。

tracking14

このとき総移動距離は、10.6mとなります。

そして、0.3s毎にデータ取得とデータ取得間隔を少し大きくすると↓のようになります。

tracking16

このとき総移動距離は、5.8mとなり、細かいノイズが減ったことでそこそこいい数字になったかと思います。

まだ改善の余地はあるかと思いますが、このポイントだけで条件を決めるわけにはいかないので、いろんなポイントパターンをみながら改善していきたいと思います。

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

■環境
Windows10
Python3.5
OpenCV3.2+contrib

[:en]先回、【OpenCVを使ったスポーツ画像解析1(モーショントラッキング)】テニス選手の移動量や軌跡をデータ化する
にて、選手(フェデラー)の動きをトラッキングする様子を動画で説明しました。

バウンディングボックスで選手をトラッキングしていますが、その重心の移動を軌跡データとして描画した動画が↓になります。

トラッキングデータである移動軌跡をグラフ上にプロットしてみます。

赤丸の位置をスタート位置として、そのあとの移動軌跡が描けていることがわかります。

tracking1

グラフの軸の単位はpixelになっており、これをmに変換する必要があるのと、遠近補正を施す必要があります。
斜め上から撮影した動画になっていますが、遠近補正で真上から見た画像に変換します。

遠近補正にはホモグラフィ変換という変換法を使用しました。
opencvでは、findHomographyという関数を使用することで、台形から長方形へと遠近補正することができます。

pixelからmへの単位変換は、テニスコートのサイズは、縦23.8m 横 8.23mとなるので、縦2380 横823の長方形に変換しました。

tracking11

軌跡が描けたので、次は移動距離を計算したいと思います。

見やすくするために、移動軌跡を拡大します。

tracking13

移動距離は点間距離の合計値を総移動距離としています。
この場合、総移動距離は1989=19.9mとなりました。

動画を見ればわかりますが、このポイントでは19.9mも動いていませんよね。
これは、
・サーブを打っているときの移動量が大きくでてしまう(フォームモーションの影響?)
・0.03s(30fps)毎にデータ取得しているので、細かいノイズがのってしまう
の2点の影響で、実際の移動量よりも大きい移動量が算出されていると考えられます。

なので、今回は、
・サーブの時間帯(0~80フレーム)は省く
・0.3s(3fps)でデータ取得と間隔を大きくする
ことで、実際の移動距離に近づける作業をしました。

サーブの時間帯(0~80フレーム)を省いた軌跡データをみてみましょう。

tracking14

このとき総移動距離は、10.6mとなります。

そして、0.3s毎にデータ取得とデータ取得間隔を少し大きくすると↓のようになります。

tracking16

このとき総移動距離は、5.8mとなり、細かいノイズが減ったことでそこそこいい数字になったかと思います。

まだ改善の余地はあるかと思いますが、このポイントだけで条件を決めるわけにはいかないので、いろんなポイントパターンをみながら改善していきたいと思います。

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

■環境
Windows10
Python3.5
OpenCV3.2+contrib

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