この記事では、引き続き練習プロジェクトに Mediapipe を使用し、PoseDetector クラスを基本的な姿勢検出クラスとしてカプセル化します。
メディアパイプでの人体姿勢検出の結果はハンドトラッキング検出の結果と同様であり、どちらもいくつかの位置決め点を出力します。各位置決め点の ID と対応する人体の位置は次の図に示されています。
mediapipe のポーズ ソリューション クラスの詳細については、Baidu またはここを参照してください。
MediaPipe の基本 (5) Pose_mediapipe pose-CSDN ブログ記事は 1.5 回閲覧および読まれ、9 回いいね! され、110 回収集されました。1. 概要 ビデオからの人間の姿勢推定は、身体運動の定量化、手話認識、全身ジェスチャー制御など、さまざまなアプリケーションで重要な役割を果たします。たとえば、ヨガ、ダンス、フィットネス アプリケーションの基礎を形成できます。また、拡張現実の物理世界の上にデジタル コンテンツや情報をオーバーレイすることもできます。MediaPipe Pose は、BlazePose 研究を利用して、RGB ビデオ フレームから全身の 33 の 3D ランドマークと背景セグメンテーション マスクを推論する、高忠実度のボディ ポーズ トラッキングのための ML ソリューションです。これは、ML Kit ポーズ検出 API のサポートでも利用できます。現在の最先端のメソッドは、推論のために主に強力なデスクトップ環境に依存しており、私たちのメソッドは 以前の手検出コードに似ています。PoseDetector
import cv2 as cv
import mediapipe as mp
import time
#mediapipe的pose用于检测人体姿态
#参考资料:https://blog.csdn.net/weixin_43229348/article/details/120541448
class PoseDetector():
def __init__(self,
mode = False,
modelComplexity = 1,
upperBodyOnly = False,
smoothLandmarks = True,
minDetectionConfidence = 0.5,
minTrackConfidence = 0.5):
self.mpPose = mp.solutions.pose
self.pose = self.mpPose.Pose(mode, modelComplexity, upperBodyOnly, smoothLandmarks, minDetectionConfidence, minTrackConfidence)
self.mpDraw = mp.solutions.drawing_utils
def Detect(self, img, drawOnImage = True):
#mediapipe需要RGB,opencv默认的格式为BGR,进行转换
imgRGB = cv.cvtColor(img, cv.COLOR_BGR2RGB)
self.results = self.pose.process(imgRGB)
if (self.results.pose_landmarks):
#print(results.pose_landmarks)
if drawOnImage:
self.mpDraw.draw_landmarks(img, self.results.pose_landmarks, self.mpPose.POSE_CONNECTIONS)
return img
def GetPosition(self, img, drawOnImage = True):
landmarkList = []
if self.results.pose_landmarks:
for id, landmark in enumerate(self.results.pose_landmarks.landmark):
h,w,c = img.shape
x = int(landmark.x * w)
y = int(landmark.y * h)
landmarkList.append([id, x, y])
if (drawOnImage):
#cv.circle(img, (x,y), 5, (0,255,0))
cv.putText(img, str(id), (x,y), cv.FONT_HERSHEY_PLAIN, 1, (0,255,0), 1)
return landmarkList
def DisplayFPS(img, preTime):
curTime = time.time()
if (curTime - preTime == 0):
return curTime;
fps = 1 / (curTime - preTime)
cv.putText(img, "FPS:" + str(int(fps)), (10,70), cv.FONT_HERSHEY_PLAIN,
3, (0,255,0), 3)
return curTime
def main():
poseDetector = PoseDetector()
video = cv.VideoCapture('../../SampleVideos/acts.mp4')
#FPS显示
preTime = 0
while True:
ret,frame = video.read()
if ret == False:
break;
frame = poseDetector.Detect(frame)
poseDetector.GetPosition(frame)
preTime = DisplayFPS(frame, preTime)
cv.imshow('Real Time Hand Detection', frame)
if cv.waitKey(10) & 0xFF == ord('q'):
break;
video.release()
cv.destroyAllWindows()
if __name__ == "__main__":
main()
操作結果:
私の B ステーションのビデオを参照してください。