본문 바로가기
  • You find inspiration to create your own path !
업무 자동화/python & CAD

움직이는 손가락 관절을 그려주는 프로그램

by ToolBOX01 2025. 8. 29.
반응형

▣ 설치 패키지 :

코드를 실행하려면 다음 명령어로 필요한 라이브러리를 설치해야 합니다:

pip install opencv-python mediapipe

 

프로그램 설명

  • MediaPipe Hands: 손의 21개 관절(landmarks)을 감지하고 추적합니다.
  • OpenCV: 웹캠에서 비디오 프레임을 캡처하고 이미지를 처리합니다.
  • 코드 동작:
    웹캠에서 손을 감지하고, 각 관절의 좌표를 출력하며, 관절을 초록색 점과 선으로 시각화합니다.
    여기서는 엄지손가락 끝(Tip)의 좌표를 예시로 출력합니다.
  • 종료: ESC 키를 누르면 프로그램이 종료됩니다.
import cv2
import mediapipe as mp

# MediaPipe Hands 모델 초기화
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
    max_num_hands=1,  # 최대 1개의 손 감지
    min_detection_confidence=0.7,
    min_tracking_confidence=0.5
)
mp_drawing = mp.solutions.drawing_utils

# 웹캠 캡처
cap = cv2.VideoCapture(0)

while cap.isOpened():
    success, image = cap.read()
    if not success:
        print("웹캠을 열 수 없습니다.")
        break

    # 이미지 BGR에서 RGB로 변환
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    # 이미지 처리용으로 복사
    image.flags.writeable = False
    results = hands.process(image)

    # 이미지 다시 BGR로 변환
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

    # 손 감지 결과 처리
    if results.multi_hand_landmarks:
        for hand_landmarks in results.multi_hand_landmarks:
            # 손 관절 그리기
            mp_drawing.draw_landmarks(
                image,
                hand_landmarks,
                mp_hands.HAND_CONNECTIONS,
                mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2, circle_radius=2),
                mp_drawing.DrawingSpec(color=(0, 0, 255), thickness=2)
            )
            # 관절 좌표 출력 (예: 엄지손가락 끝)
            thumb_tip = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP]
            print(f"엄지손가락 끝: (x: {thumb_tip.x}, y: {thumb_tip.y}, z: {thumb_tip.z})")

    # 화면에 이미지 표시
    cv2.imshow('Hand Tracking', image)
    if cv2.waitKey(5) & 0xFF == 27:  # ESC 키로 종료
        break

# 리소스 해제
cap.release()
cv2.destroyAllWindows()

 

 

 


반응형