サッカーのキック解析を MATLAB で(OpenPoseデータ)

これは サッカーのキックのバイオメカニクス の実践編です。前回はキックをフェーズに分解しました。今回は MATLAB で実際に解析します——OpenPose の JSON 出力から、関節角度・平滑化した信号・各フェーズのタイミング・結果テーブルを作ります。

1. OpenPose の JSON を読み込む

OpenPose はフレームごとに JSON を出力します。dir でファイル一覧を取得し、ループで各ファイルを fileread で読み、jsondecode でパースして data{i}.people(1).pose_keypoints_2d を取り出します。このベクトルは BODY_25 の25関節ぶん、各関節が X・Y・信頼度(confidence)の順に並んでいるので、3つの行列に分けます——X = P(1:3:end)Y = P(2:3:end)Conf = P(3:3:end)。結果は 25関節 × フレーム数(ここでは64)になります。

MATLABコード: fileread と jsondecode で JSON を読み、pose_keypoints_2d を X・Y・信頼度に分割
JSON を読み込み、キーポイントを X・Y・信頼度に分割。

関節の並び順は OpenPose で固定です(「OpenPose BODY_25」で検索)。順序が分かれば、どの行がどの関節かが分かります。

2. 関節角度を計算する

関節角度は、2つの体節(ベクトル)のなす角です。膝なら、膝→足首のベクトルと膝→股関節のベクトルを取り、堅牢な2引数の逆正接を使います: atan2d(|det([v1; v2])|, dot(v1, v2))。行列式が「対辺」(外積の大きさ)、内積が「隣辺」に相当します。そこから 180° を引いて解剖学的な角度にします。

膝・股関節・足首の角度を 180 - atan2d(det, dot) で計算するMATLABコード
体節ベクトルの行列式と内積を使った atan2d による関節角度。

関節ごとの調整:

  • : 180 - atan2d(...)。膝は現実的に180°を超えません。
  • 股関節: 180 を引かない——股関節は180°を超え得るため。符号でバックスイング(負)とフォワードスイング(正)を区別します。右股関節はさらに符号を反転(鏡像側)し、内積も負にして符号を揃えます。
  • 足首: 90 - atan2d(...)。自然な立位の足首は約90°だからです。

3. データを平滑化(カットオフはパワースペクトルで決める)

生の角度はノイズが多いので、Butterworth ローパスフィルタで平滑化します。決めるべきはカットオフ周波数だけで、パワースペクトルから客観的に選べます。フレームレートをサンプリング周波数(fs = 240)として pspectrum(angle, fs) を実行し、パワー vs 周波数をプロット: 本来の信号は低周波に集中し、パワーはノイズ床へ落ちます。ここではその境目が約 19 Hz です。

パワースペクトル(pspectrum)。低周波にパワーが集中し、カットオフ決定に用いる
パワースペクトル(pspectrum, fs = 240)。約19Hzを超えるとノイズ床に落ち、そこをカットオフに。

次に [b,a] = butter(2, 19/(fs/2), 'low') でフィルタを作り、ゼロ位相の filtfilt(b, a, angle) で適用します。結果はきれいな平滑波形です。

butter と filtfilt によるフィルタ後の平滑な膝角度
butter + filtfilt 後: 解析に使える平滑な膝角度の波形。

4. 角速度・フェーズ・接地

平滑化した角度から角速度(とその最大値)を計算し、バイオメカニクス記事と同じキネマティクスから各フェーズを特定します。最大股関節角度がバックスイングの終わり、最大膝角度がレッグコッキングとレッグアクセラレーションの目印です。各フェーズは動作全体に対する割合(そのフレーム番号÷総数×100)で表します。

注意が要るのは支持脚の接地(landing)です。自動——足首の鉛直位置が最も低いフレーム——でも、画像フレームを送って目視で読み取っても構いません(ここでは約45フレーム目)。支持脚のフェーズ(衝撃吸収、エネルギー伝達)は、その膝キネマティクスから続けて求めます。

5. 結果をテーブルにまとめる

最後に、名前付きの MATLAB table に全部まとめます——蹴り脚の最大股関節角度(51°)、最大膝角度(90°)、最大膝角速度、股関節・膝の衝撃吸収/エネルギー伝達の範囲や速度など、計14変数です。writetable で CSV に保存すれば、被験者や試技の比較ができます。

14個の結果変数をテーブルにまとめ、writetable で CSV に書き出すMATLABコード
14個の結果変数をテーブルにまとめ、writetable でエクスポート。

まとめ

これで、再現可能なパイプラインが完成です: OpenPose のキーポイントを入力し、関節角度とフェーズ指標を出力——すべて数十行の MATLAB で。同じロジックは Python にもそのまま移せます(無料ツール派に)。バイオメカニクス解説と合わせれば、マーカーレスのキック解析の「何を」と「どうやって」の両方が揃います。


著者について

Takashi Fukushima — スポーツ・運動科学 × Human Pose Estimation × Computer Vision × XR を横断して研究・開発しています。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール