こんにちは
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 = ',')