[파이썬] 컴퓨터 비전을 활용한 손가락 동작 인식

손가락 동작 인식은 컴퓨터 비전 분야에서 많이 연구되고 있는 주제 중 하나입니다. 이 기술은 손가락 움직임을 감지하고 분석하여 사용자의 의도를 이해하는 데에 활용될 수 있습니다. 예를 들어, 손 동작을 통해 컴퓨터를 제어하거나 가상 현실 환경에서 상호작용을 할 수 있습니다.

이번 블로그 포스트에서는 Python을 사용하여 손가락 동작 인식을 구현하는 방법에 대해 알아보겠습니다.

손가락 동작 데이터 수집

먼저, 손가락 동작을 인식하기 위해서는 데이터를 수집해야 합니다. 이를 위해 웹캠을 사용하여 손가락 동작을 촬영하고, 각 동작에 대한 레이블을 부여해야 합니다.

import cv2
import numpy as np

# 웹캠 초기화
cap = cv2.VideoCapture(0)

# 손가락 동작 레이블
labels = ["가위", "바위", "보"]

# 데이터 수집
while True:
    ret, frame = cap.read()

    # 프레임 처리 로직
    
    cv2.imshow("Hand Gesture Recognition", frame)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

위의 코드를 실행하면 웹캠으로부터 손가락 동작을 실시간으로 촬영할 수 있습니다. 이 때, 동작에 대한 레이블을 정의하여 해당 동작을 식별할 수 있도록 합니다.

손가락 동작 분석

손가락 동작을 구분하기 위해서는 이미지 처리 알고리즘이 필요합니다. 여러 가지 방법이 있지만, 이번 포스트에서는 컨투어와 convex hull을 이용하여 손의 윤곽을 추출하고, 손가락의 개수를 세는 방법을 사용하겠습니다.

import cv2
import numpy as np

# 이미지 전처리
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
ret, thresh = cv2.threshold(blur, 70, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 손의 윤곽 추출
contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour = max(contours, key=lambda x: cv2.contourArea(x))

# 손바닥 검출
hull = cv2.convexHull(contour)

# 손가락 개수 세기
def count_fingers(contour):
    # 손바닥 중심 좌표 계산
    center = tuple(contour[0][0])

    # 손바닥과 손가락 사이의 각도 계산
    angles = []
    for point in contour[1:]:
        angle = np.arctan2(point[0][1] - center[1], point[0][0] - center[0])
        angles.append(angle)

    # 각도를 오름차순으로 정렬
    angles = sorted(angles)

    # 손가락 개수 카운트
    finger_count = 0
    for i in range(1, len(angles)):
        diff = angles[i] - angles[i-1]
        if diff > np.pi/4:
            finger_count += 1

    return finger_count

num_fingers = count_fingers(hull)
print("손가락 개수:", num_fingers)

위의 코드는 이미지를 전처리하고, 손의 윤곽을 추출한 뒤 손바닥과 손가락 사이의 각도를 계산하여 손가락의 개수를 세는 방법을 보여줍니다.

손가락 동작 인식

이제 손가락 동작을 인식하는 단계입니다. 손가락 개수를 기반으로 각 동작에 대한 임계값을 설정하고, 손가락 개수와 임계값을 비교하여 동작을 판별합니다.

# 동작 인식
def recognize_gesture(num_fingers):
    if num_fingers == 2:
        return "가위"
    elif num_fingers == 5:
        return "바위"
    else:
        return "보"

gesture = recognize_gesture(num_fingers)
print("인식된 동작:", gesture)

위의 코드는 손가락 개수에 따라 동작을 판별하는 방법을 보여줍니다. 손가락 개수와 각 동작에 대한 임계값을 설정하여, 손가락 동작을 인식할 수 있습니다.

이러한 방식으로 Python을 사용하여 손가락 동작을 인식하는 컴퓨터 비전 시스템을 구현할 수 있습니다. 손가락 동작 인식은 다양한 응용 분야에서 활용될 수 있으며, 실시간으로 동작을 인식하는 기술을 개발하는 것은 매우 흥미로운 도전입니다.