본문 바로가기
Coding(코딩)/Python

[Python] 미디어파이프(MediaPipe)를 이용한 모션 트래킹

by DevKev 2023. 2. 10.

To Do

opencv & mediapipe 패키지 설치

✅ mediapipe 활용해보기

 

Mediapipe(미디어파이프)

미디어파이프는 머신러닝(Machine Leanring)을 이용하여,

영상이나 라이브 스트리밍 이미지에 대한 분석을 할 수 있는 모듈/패키지이다.

파이썬에서는 대표적으로 얼굴 인식, 포즈 인식 등이 가능하다.

얼굴 인식포즈 인식
[ 얼굴 인식과 포즈 인식 기능 ]

 

공식 사이트에 따르면, 파이썬에서는 다음과 같이 제한된 기능이 제공된다.

 

 

 

 

  Android iOS C++ Python JS Coral
Face Detection
Face Mesh  
Iris      
Hands  
Pose  
Holistic  
Selfie Segmentation  
Hair Segmentation        
Object Detection    
Box Tracking      
Instant Motion Tracking          
Objectron    
KNIFT          
AutoFlip          
MediaSequence          
YouTube 8M          

 

여기서는 Pose에 관련한 것만 다룰 것이기 때문에 충분하다.

그럼 이제 설치하고 놀아보자.

Installation(설치)

conda create -n 가상환경
conda activate 가상환경
conda install python=3.7.9
pip install mediapipe
conda install opencv

가상환경을 만들어 두고 진행해야 다른 라이브러리와 충돌이 나지 않으니

꼭! 가상환경을 구축해 놓고 진행하는 습관을 들이자.

 

여러 번 설치에 실패를 했어서 위와같이 순서대로 진행하면 나 같은 경우에는 충돌이 나지 않았다.

 

Let's play(가지고 놀아보자)

[ 예시: 운동 영상에서  Pose 트래킹]

아래와 같은 예제 코드로 경로의 영상을 불러오면,

import cv2
import mediapipe as mp
import time

mpDraw = mp.solutions.drawing_utils
mpPose = mp.solutions.pose
pose = mpPose.Pose()

cap = cv2.VideoCapture('pullup_videos/2.mp4')
pTime = 0

while True:
    success, img = cap.read() # img => BGR
    # convert to RGB for the compatibility with mediapipe library
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = pose.process(imgRGB)

    if results.pose_landmarks:
        """
        results.pose_landmarks: 특징점 추출
        mpPose.POSE_CONNECTIONS: 특징점 연결
        """
        mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)
        for id, lm in enumerate(results.pose_landmarks.landmark):
            h, w, c = img.shape
            print(id, lm)
            # pixel value로 변환
            cx, cy = int(lm.x*w), int(lm.y*h)
            cv2.circle(img, (cx,cy), 5, (255,0,0), cv2.FILLED)

    cTime = time.time()
    fps = 1/(cTime-pTime)
    pTime = cTime

    cv2.putText(img, str(int(fps)), (70,50), cv2.FONT_HERSHEY_PLAIN, 3,
    (255,0,0), 3)
    cv2.imshow("Image", img)
    cv2.waitKey(1) # 1ms delay
 

다음과 같은 모션 트래킹이 가능하다.

 

[ pose tracking 예시 ]