비전

[MediaPipe] 포즈 인식

왕초보코딩러 2024. 8. 25. 22:23
728x90

미디어파이프란 구글에서 제공하는 AI 오픈소스이다

 

 

미디어파이프 설치

pip install mediapipe

 

필요 라이브러리 임포트

import mediapipe as mp
import cv2

 

 

mp.solutions: 미디어파이프 솔루션들이 포함되어 쉽게 사용할 수 있다

 

 

- 얼굴 탐지

mp.solutions.face_detection

- 얼굴 메시

mp.solutions.face_mesh

- 손 추적

mp.solutions.hands

- 포즈 추정

mp.solutions.pose

- 신체 전체 추적

mp.solutions.holistic

- 랜드마크 시각화 툴

mp.solutions.drawing_utils

- 미리 정의된 스타일 툴

mp.solutions.drawing_styles

- 인물과 배경 분리

mp.solutions.selfie_segmentation

 

 

https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/pose.md

 

mediapipe/docs/solutions/pose.md at master · google-ai-edge/mediapipe

Cross-platform, customizable ML solutions for live and streaming media. - google-ai-edge/mediapipe

github.com

 


 

33개의 랜드마크 추출

 

 

 

미디어파이프

mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles

pose = mp_pose.Pose()

 

 

이미지 넣기

img = cv2.imread('data/yoga.jpg')
    
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
# 결과 33개 좌표 값
result = pose.process(img_rgb) # rgb로 넣어줘야 한다 

# print(result.pose_landmarks)

 

결과는 이런 식으로 나옵니다

landmark {
  x: 0.355119169
  y: 0.78029573
  z: -0.0436405
  visibility: 0.997867346
}
landmark {
  x: 0.343139768
  y: 0.77909714
  z: -0.0654732585
  visibility: 0.99845922
}
landmark {
  x: 0.342421114
  y: 0.776517332
  z: -0.0654517
  visibility: 0.998709559
}
landmark {
  x: 0.34174782
  y: 0.773604512
  z: -0.0654567704
  visibility: 0.998589
}
landmark {
  x: 0.343171686
  y: 0.779188275
  z: -0.0311653
  visibility: 0.998814583
}
landmark {
  x: 0.342517614
  y: 0.777040541
  z: -0.0311453324
  visibility: 0.998945415
}

 

 

인식 됐으면 그리기

# 인식이 됐으면
if result.pose_landmarks:
    mp_drawing.draw_landmarks(
        img,
        result.pose_landmarks,
        mp_pose.POSE_CONNECTIONS,
        mp_drawing_styles.get_default_pose_landmarks_style()
    )

 

좌표 값 추출

# 좌표가 width와 height를 1로 봤을 때 얼만큼 위치했는지(*width, *height하면 실제 좌표 나온다)
hip_x = result.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_HIP].x
hip_y = result.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_HIP].y
print(hip_x)
print(hip_y)
print(f'real x: {hip_x * img.shape[1]}') # *width
print(f'real y: {hip_y * img.shape[0]}') # *height

 

 

이미지 출력

cv2.imshow('face_mesh', img)
    
cv2.waitKey() 
cv2.destroyAllWindows()

 

'비전' 카테고리의 다른 글

[MediaPipe] 얼굴 매쉬2  (0) 2024.09.03
[MediaPipe] 얼굴 매쉬1  (1) 2024.09.02
[MediaPipe] 얼굴 인식  (0) 2024.08.23
[OpenCV] 특정 색 검출  (0) 2024.08.20
[OpenCV] 그리기 함수  (0) 2024.08.19