- gesture은 dictionary로 Key:Value 데이터 타입으로 관리 > key는 임의의 라벨링 번호(학습 시킨 라벨링 번호) value는 해당하는 알파벳 내용 > gesture는 keyboard 모듈 활용(delete 기능 등..)
# MediaPipe hands model
mp_hands=mp.solutions.hands # 웹캠 손 위치 정보 유틸리티
mp_drawing = mp.solutions.drawing_utils # 손 정보 기반으로 그리기
# 손가락 detection 모듈을 초기화
hands=mp_hands.Hands(
max_num_hands=max_num_hands, # 최대 손 인식
min_detection_confidence=0.5, # 최소 탐지 신뢰도 기본값=0.5
min_tracking_confidence=0.5# 최소 추적 신뢰도 기본값=0.5
)
- mediapipe를 사용하기 위한 기본 설정
# 제스처 인식 모델
f=open('test.txt','w') # 학습시킬 dataset 저장하기
file=np.genfromtxt('dataSet.txt',delimiter=',')
angle = file[:,:-1].astype(np.float32) # 각도
label = file[:, -1].astype(np.float32) # 라벨
knn=cv2.ml.KNearest_create() # knn(k-최근접 알고리즘)
knn.train(angle,cv2.ml.ROW_SAMPLE,label) # 학습!
- mediapipe에 존재하는 정보 유틸리티 활용 - mediapipe 옵션 설정 - gesture 인식 모델은 추가적인 기능을 학습시킬 때 사용 > 해당 코드에서는 delete 기능 추가 - 제스쳐 학습을 위해 knn 알고리즘 사용
# 웹캠 열기
cap=cv2.VideoCapture(0)
# 웹캠에서 한 프레임씩 이미지를 읽어옴
startTime = time.time()
prev_index = 0
sentence = ''
recognlzeDelay = 1
whileTrue:
ret,img = cap.read()
ifnot ret:
break
- 수화 인식을 하기 위해 opencv 모듈로 웹캡을 연다. - 변수 ret, img 사용 목적 > ret : 프레임 읽기 성공 또는 실패 여부, True / False img : 프레임 이미지, Numpy 배열 또는 None
img = cv2.flip(img, 1)
imgRGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
result = hands.process(imgRGB)
# 각도를 인식하고 제스처를 인식하는 부분
if result.multi_hand_landmarks isnotNone: # 만약 손을 인식하면
for res in result.multi_hand_landmarks:
# joint == 랜드마크에서 빨간 점
# joint는 21개가 있고 x,y,z 좌표니까 21,3
joint = np.zeros((21,3))
for j,lm inenumerate(res.landmark):
joint[j] = [lm.x,lm.y,lm.z] # 각 joint마다 x,y,z 좌표 저장
- cv2.flip은 이미지 반전효과기능 (웹캠 사용 시 반대로 인식하기 때문) - cv2.cvtColor(img,cv2.COLOR_BGR2RGB) > openCV 는 기본적으로 BGR의 형태로 변환하여 데이터를 가져오고, PIL 은 이미지가 가지고있는 형식 그대로를 가져온다. > 색감을 적용하는 모듈에 맞춰 형태를 변경해줘야 때문 - 위에서 설정해준 mp 활용하여 만든 변수 hands로 해당 이미지가 어떤 의미인지 파악