본문 바로가기
모각코

[모각코] 물랑룽즈 - 6차

by 솔이당 2024. 2. 6.

퍼듀 프로젝트
Mediapipe Pose
주제: Vehicle theft prevention system based on Computer vision and IoT sensors

 

 

pose_landmarks

  • 1point 좌표당 x, y, z의 좌표 값과 visbility 총 4가지 데이터를 받을 수 있음
    • x: 이미지 너비, 0.0 ~ 1.0 사이값으로 정규화된 랜드마크 좌표
    • y: 이미지 높이, 0.0 ~ 1.0 사이값으로 정규화된 랜드마크 좌표
    • z
      • x 좌표와 같은 척도를 사용하는 좌표 값 
      • 엉덩이 중심점 깊이를 원점으로 하여 랜드마크의 깊이를 나타냄
      • 엉덩이 중심점과 카메라 거리를 측정 후 0.0 ~ 1.0 사이값으로 정규화된 랜드마크 좌표
      • 값이 작으면 카메라에 가까워짐
    • visibility: 0.0 ~ 1.0 사이값으로 이미지에서 랜드마크가 보이는 가능성
    • x, y, z 좌표 값: 중심점 기준이므로 결론적으로 -1.0 ~ 1.0 값
  • 한 사진의 포즈에서 skeleton 정보가 33개 있으므로 총 132가지 정보를 추출할 수 있음

 

 

실시간 웹캠에서 포즈 감지 및 각도 계산하기

import cv2
import mediapipe as mp
import numpy as np

def calculate_angle(a, b, c):
    a = np.array(a)
    b = np.array(b)
    c = np.array(c)

    radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - np.arctan2(a[1] - b[1], a[0] - b[0])
    angle = np.abs(radians * 180.0 / np.pi)

    if angle > 180.0:
        angle = 360 - angle

    return angle


cap = cv2.VideoCapture(0)

with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
    while cap.isOpened():
        ret, frame = cap.read()

        image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        image.flags.writeable = False

        results = pose.process(image)

        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        
        mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,
                                  # Landmarks
                                  mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2),
                                  # Connections
                                  mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2))


        try:
            landmarks = results.pose_landmarks.landmark

            shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x, landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]
            elbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x, landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]
            wrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x, landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]
            
            angle = calculate_angle(shoulder, elbow, wrist)
            

        except:
            pass
            
        cv2.imshow('Mediapipe Feed', image)

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
            
    cap.release()
    cv2.destroyAllWindows()

 

'모각코' 카테고리의 다른 글

[모각코] 물랑룽즈 - 5차  (0) 2024.02.02
[모각코] 물랑룽즈 - 4차  (0) 2024.02.01
[모각코] 물랑룽즈 - 3차  (0) 2024.01.28
[모각코] 물랑룽즈 - 2차  (0) 2024.01.22
[모각코] 물랑룽즈 - 1차  (0) 2024.01.14