こんにちは
google から出させているmediapipeと呼ばれるパッケージが結構面白いので動かしてみました。
mediapipeは、googleから出させているパッケージの一つで、映像データから身体の関節表点の位置や手の形状、顔の形状を検出することができるものです。
人の動きが簡単に取得できるので、いろいろと使えそうですね。OpenPoseとかみたいなやつだと自分でいろいろとCUDAの設定をしたりだの、いろんなパッケージを入れないといけないこともあったりするので煩雑なのですが、こちらのmediapipeは非常に簡単に実装することが可能です。
今回はとりあえず動画データを読み込んでpythonを使ってmediapipeを動かして関節表点を取り出す所までのコードを紹介したいと思います。間違いとかあったらすみません。
mediapipeのインストール
mediapipeを動かすpythonコード
#必要なパッケージのインポート
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose
import numpy as np
mp_drawing = mp.solutions.drawing_utils
mp_holistic = mp.solutions.holistic
data_land = np.zeros((0,99))
# stream mp4 file
cap = cv2.VideoCapture('_____.mp4')#load mp4 file
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("Ignoring empty camera frame.")
break
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = holistic.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
mp_drawing.draw_landmarks(
image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)
#get coordinate
data_land2 = np.zeros((1,3))
for x in range (0,33):
data1 = results.pose_landmarks.landmark[x].x
data2 = results.pose_landmarks.landmark[x].y
data3 = results.pose_landmarks.landmark[x].z
keydata = np.hstack((data1,data2,data3)).reshape(1,-1)
data_land2 = np.hstack((data_land2,keydata))
data_land2 = data_land2[:,3:]
data_land = np.vstack((data_land,data_land2))
cv2.imshow('MediaPipe Holistic', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
np.savetxt('keypoint_results.csv',data_land,delimiter = ',')