初めに
モーションキャプチャは特殊なカメラや機材などが必要であったが、近年PCや携帯のカメラ機能を用いてモーションキャプチャを試すことができるようになりました。本研究で作成した一例を先に紹介し、その後詳細な研究内容を紹介します。
高齢者体操ゲームへの応用例
MediaPipeプログラムの応用例として高齢者向け体操ゲームを作成しました。こちらのゲームは高齢者が高齢者施設や自宅で簡単に様々な体操を手本の映像を見ながら楽しめるゲームです。
また、ウェブカメラで自身を撮影し、MediaPipeプログラムで動作解析を行い、自分の苦手な動作のサポートや間違った動作の修正などリアルタイムで行うことが可能な機能もあります。
日々の運動の継続を促すスコアの記録や、一か月ごとのプレイ履歴など様々な機能も搭載予定です。
本研究は環境デザイン研究室の大学院メンバーとの共同研究です。ゲームの実装は環境デザイン研究室が行ったものです。
研究概要
高齢者施設や自宅に居る高齢者等が体操を行い、自身の健康状態確認や日々の運動の継続をサポートすることが可能なアプリケーションを開発することが最終的な目標です。本研究ではPythonで使用可能なMediaPipeというライブラリを用いモーションキャプチャのシステム開発を行います。
また、モーションキャプチャスタジオで撮影を行いゲーム上で体操の手本となるモーションの撮影を行い、各関節等の正確なデータ収集を行います。
MediaPipeについて
本研究ではMediaPipeを用いてモーションキャプチャのプログラムを作成しました。
MediaPipeとは画像や動画、リアルタイム映像からモーションキャプチャを行うことができるフレームワークです。手や物体、全身検出などの機能があり様々な場面で使用されています。
手の検出HandTrackingでは以下の動画のようなじゃんけんの判定等も可能です。
今回はPythonにて使用しましたが、C++やiOS、Androidなどでこちらのフレームワークを試すことができます。
MediaPipeプログラム
MediaPipeの機能の一つであるHuman Pose Detection and Tracking(全身の検出)を用いラジオ体操の解析を行うプログラムを作成しました。
研究の第一段階として、椅子に座った状態での上半身のみの動作解析を行った。
第二段階ではあらかじめ撮影した動画をPythonプログラムにて動作解析を行い、腕をどの程度挙げられているか、肘をどの程度曲げられているかなど細かな数値を算出し、2分程度の体操(ラジオ体操)を続けて動作解析を行えるようにした。
第三段階ではPCのwebカメラを用いリアルタイム映像から動作解析を行えるようにした。
以下のプログラムは映像の読み込みとMediaPipeのモーションキャプチャの実行部分です。まず検出の精度の初期パラメータを指定し、cap.isOpened()で動画、画像、リアルタイム映像の1フレームずつの画像を読み込む。読み込みが完了していた場合OpenCVで読み込んだ画像のカラーコードをMediaPipe用に変換し、holstic.process(image)で全身の検出を行っています。
with mp_holistic.Holistic(
min_detection_confidence=0.5,
min_tracking_confidence=0.5) as holistic:
while cap.isOpened():
success, image = cap.read()
if not success:
print("empty camera.")
break
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = holistic.process(image)
全身の検出後、腕の長さや腰の位置を記録しその結果を元にラジオ体操の各動作の解析を行います。以下のプログラムはラジオ体操の一番初め「伸びの運動」の解析プログラムの一部です。
def motion_num_1(angle_r, angle_l, r_y, l_y, r_y2, l_y2, length_of_r_arm, length_of_l_arm,p_count, flag, frame):
p_count = 0
max_r_hand = r_y - length_of_r_arm
max_l_hand = l_y - length_of_l_arm
if max_r_hand + max_r_hand*0.2 > r_y2 and max_l_hand
+ max_l_hand*0.2 > l_y2 and flag == 0:
flag += 1
frame = 0
elif flag == 1 and frame == 40:
p_count = 1
flag = 0
frame = 0
elif frame == 90:
frame = 0
frame += 1
return flag, p_count, frame
モーションキャプチャスタジオでの撮影
以下の動画はモーションキャプチャスタジオにてラジオ体操第一を撮影し、編集を行ったモーションデータをキャラクターに流し込んだものになります。こちらのモーションをゲーム上で使用しました。
開発環境(MediaPipeプログラム)
使用プログラム言語 Python
使用ライブラリ MediaPipe/OpenCV/NumPy
その他ツール PyCharm
開発環境(アプリケーション)
使用ゲームエンジン Unity
使用プログラム言語 C#/Python
使用プラグイン SQLiteUnity3d/MediaPipeUnityPlugin
コメント