본문 바로가기
인공지능 기초

미디어 파이프 핸즈

by SwMaker_Jun 2023. 11. 3.
728x90
반응형

1. 핸즈 모델 활용하기.

    미디어파이프는 구글에서 개발한 오픈소스 미디어 처리 프레임워크로, 비디오 및 오디오 데이터의 실시간 처리와

기계 학습을 위한 강력한 도구를 제공합니다. 미디어파이프는 머신러닝 모델의 입력으로 다양한 미디어 데이터를 효율적

으로 처리하고 분석하는 데 사용됩니다.

핸즈모델 인식

 

미디어파이프 핸즈 관절 랜드마크

 

 

2. 핸즈 모델 기본코드

 

mediapie hands 모델 오픈소스

 

 

 

========================================================================

 

# 미디어파이 핸즈

import cv2
import mediapipe as mp

# 미디어 파이프의 Hand 모델을 로드합니다.
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands

cap = cv2.VideoCapture(0)

with mp_hands.Hands(max_num_hands=1, min_detection_confidence=0.5, min_tracking_confidence=0.5) as hands:
    while cap.isOpened():
        success, frame = cap.read()  # 변수 이름을 'frame'으로 변경
        if not success:
            continue
        frame = cv2.cvtColor(cv2.flip(frame, 1), cv2.COLOR_BGR2RGB)

        # 프레임을 미디어 파이프에 전달합니다.
        results = hands.process(frame)

        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

        # 랜드마크 좌표를 화면에 그립니다.
        if results.multi_hand_landmarks:
            for hand_landmarks in results.multi_hand_landmarks:
                mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)

        cv2.imshow('frame', frame)  # 창 이름도 'frame'으로 변경

        if cv2.waitKey(1) == ord('q'):
            break

cap.release()
cv2.destroyAllWindows()

 

========================================================================

 

핸즈모델 실행.

 

3. hand_landmarks.landmark[ ]   랜드 마크 좌표 구하기.

   

     (예시) hand_landmarks.landmark[4].x  * 100

 

               엄지 끝부분인 4번 랜드마크의 x 좌표를 백분률로 계산 

               이때 계산된 값은 실수 이다.

 

               위 코드에서 x, y, z 의 수치를 전부 인식하기 때문에 이를 활용해보기.

               

미디어파이프 핸즈 관절 랜드마크

변수를 활용하여 사용하기 

finger_1 = int (hand_landmarks.landmark[4].x * 100)

 

 

 

4. 해보기

https://swmakerjun.tistory.com/48

 

컴퓨터 비전 cv2.putText 활용 하여 label과 score 글씨 출력하기.

1. cv2.putText() 함수 cv2.putText() 함수는 OpenCV 라이브러리에서 제공하는 이미지에 텍스트를 추가하는 함수입니다. 이미지 및 웹캠에서 불러온 창에 원하는 텍스트를 삽입하여 시각적인 표시나 설명

swmakerjun.tistory.com

 

■ putText 함수 

 cv2.putText(frame, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)

 

※ 위 text 는 자료형 구조로 str 글자 형태로만 출력 가능

※ (10,30)은 각 x, y 픽셀 위치 좌표로 숫자형태 자료형 구조로만 가능

 

 

     가. 검지 4번 랜드마크 손가락 X축 좌표 풋텍스트 출력         

 

 

     나.  x, y 축 둘다 출력해 보자.

x축 y축 출력

 

 

 

 다.  x, y 축을 랜드마크 검지를 따라 다니도록 만들어 보자.

 

       # 랜드마크 8번 (검지 손가락 끝 부분)의 x와 y 좌표를 가져옵니다.
           finger_x = int(hand_landmarks.landmark[8].x * frame.shape[1])
           finger_y = int(hand_landmarks.landmark[8].y * frame.shape[0])

 

           이 코드는 미디어 파이프를 사용하여 감지된 손의 랜드마크 중에서 8번 랜드마크 (검지 손가락의 끝 부분)의

           좌표를 이미지 프레임의 크기에 맞게 변환하여 저장하는 부분입니다.

 

         1)  hand_landmarks.landmark[8].x 

               이 코드에서 hand_landmarks는 미디어 파이프를 사용하여 감지된 손의 랜드마크 정보를 포함하는 객체

               입니다.

               landmark[8]는 8번째 랜드마크를 나타내며, 이것은 검지 손가락의 끝 부분에 해당합니다. x는 해당 랜드

              마크의  x 좌표를 나타냅니다.

     

         2) hand_landmarks.landmark[4].y

              위와 유사하게, 이 코드에서 y는 해당 랜드마크의 y 좌표를 나타냅니다.

             

         3) frame.shape[1]

              frame은 현재 처리 중인 이미지 프레임을 나타냅니다.

              frame.shape는 이 이미지의 크기 정보를 반환하며, [1] 인덱스는 이미지의 너비 (가로)를 나타냅니다.

 

          4) frame.shape[0]

             마찬가지로, [0] 인덱스는 이미지의 높이 (세로)를 나타냅니다.

 

             따라서 이 코드는 8번 랜드마크의 x와 y 좌표를 이미지 프레임의 실제 크기에 맞게 변환하여 finger_x와

             finger_y 변수에 저장합니다.

             이렇게 하면 랜드마크 좌표를 화면 크기에 상대적으로 사용할 수 있습니다.   

 

랜드마크를 따라 좌표값 따라다니기 출력

 

 

728x90
반응형