1. 핸즈 모델 활용하기.
미디어파이프는 구글에서 개발한 오픈소스 미디어 처리 프레임워크로, 비디오 및 오디오 데이터의 실시간 처리와
기계 학습을 위한 강력한 도구를 제공합니다. 미디어파이프는 머신러닝 모델의 입력으로 다양한 미디어 데이터를 효율적
으로 처리하고 분석하는 데 사용됩니다.
2. 핸즈 모델 기본코드
========================================================================
# 미디어파이 핸즈
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 축을 랜드마크 검지를 따라 다니도록 만들어 보자.
# 랜드마크 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 변수에 저장합니다.
이렇게 하면 랜드마크 좌표를 화면 크기에 상대적으로 사용할 수 있습니다.
'인공지능 기초' 카테고리의 다른 글
mediapipe hands 활용 (1) | 2023.11.22 |
---|---|
cv2.line() 함수로 선 만들기 (1) | 2023.11.14 |
(face 객체인식) 인공지능 hello bot 만들기 (0) | 2023.09.27 |
face detection putText 함수 활용 글씨 띄우기. (1) | 2023.09.12 |
mediapipe face 모델 활용 (0) | 2023.08.30 |