나는 webcam으로 영상을 촬영하고 캡쳐한 뒤,
캡쳐한 사진의 색깔을 변환하고 테두리를 따도록 하였다.
그러나 색깔 변환 시키는 것 자체에서 손 뿐만 아니라 다른 물체가 인식되기도 해서
아예 webcam으로 손을 인식할때 무엇이 인식되고 있는지 확인하도록 코드를 수정했다.
# python -m pip install opencv-python 필요
import cv2
import time
import datetime
import numpy as np
video = cv2.VideoCapture(0) # WebCam의 경우 0 또는 1
# 비디오 파일의 경우 '경로/파일명.확장자'
prev_time = 0 # 이전 프레임 재생 시간 값 0으로 초기화
FPS = 100
a = 0
# HSV pixel의 lower과 upper 경계값 정의/스킨 색 경계값 설정
# 'skin'의 범위 값 설정
lower = np.array([0, 48, 80], dtype="uint8")
upper = np.array([20, 255, 255], dtype="uint8")
필요한 기능들을 import 해준 후,
video라는 변수로 webcam을 실행시켰다.
그리고 프레임 재생 시간을 설정해준다.
그리고 원래는 영상을 찍고 난 후에 if문으로 색깔을 변환시켰지만,
lower과 upper을 바깥으로 빼주어서 애초에 영상을 찍을 때
저 범위 안의 색깔을 인식하도록 해주겠다.
while True:
ret, frame = video.read()
converted = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
skinMask = cv2.inRange(converted, lower, upper)
current_time = time.time() - prev_time # 현재 시간 - 이전 프레임 재생 시간
이제 웹캠을 실행시켜보자.
# ret이 true의 값을 가진다면 영상을 재생
if (ret is True) and (current_time > 1. / FPS): # 비교
prev_time = time.time()
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11, 11)) # 타원 모양으로 매트리스 생성
skinMask = cv2.dilate(skinMask, kernel, iterations=1)
skinMask = cv2.GaussianBlur(skinMask, (3, 3), 0)
line, _ = cv2.findContours(skinMask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(frame, line, -1, (0, 0, 255), 2) # (라인을 그릴 이미지, 검출된 컨투어, 음수로 지정할경우 모든 컨투어,색상지정(현재는 초록),선두께)
cv2.imshow("VideoCapture", frame) # imshow(윈도우 창의 이름, cv2.VideoCapture()의 리턴값)
now = datetime.datetime.now().strftime("%m-%d (%H;%M)")
key = cv2.waitKey(30) & 0xff
kernel을 통해 타원 모양으로 매트리스를 생성해준다.
그리고 skinMask의 iterations를 두번 반복하여 잡힌 범위 주변 margin를 통통?하게 해준다. (임의지정가능)
컨투어링을 사용하여 라인을 그릴 이미지를 video가 받아들이는 frame 값으로 놓는다.
그리고 나는 검출되는 컨투어들을 빨간색 라인을 통해 나타내도록 하였다.
그리고 imshow를 통해 윈도우로 나타내게 하면 끝이다!
생각보다 "살색"이라는 정의가 명확하지 않고, 빛의 양에 따라서 예민하게 웹캠이 반응하는 것 같다.
이렇게 바꾸더라도 살색 이외의 것을 잡아내더라..
그래도 웹캠으로 사진을 찍을 때 그냥 찍는 것보다는 라인 잡히는 게 더 가시적이고 좋을 것 같다.
원래는 수화 인식을 하는 프로젝트였으나 단순히 손가락의 모양을 인식하는 것에서 학기가 끝나게 되었다.
나도 여러모로 아쉬움이 많이 남는 프로젝트였다.
수화 손 동작을 머신러닝화 하여 인식된 손가락 모양과 매칭시켜 보길 원했는데, 거기까지 하진 못했다.
그래도 나름 해본다고 아이들과 자료 공유하면서, 오류 구글링 해가면서, 질문 받아가면서,
무슨 원리를 사용해볼까? 를 위주로 같이 고민하는 시간들이 소중한 한 학기였다.
<실행 영상>
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
'코딩 수업 기록 > 수화 인식 프로젝트' 카테고리의 다른 글
| [수화 인식 프로젝트] 3,4주차 수업 _ opencv 에서 webcam 캡쳐하여 모서리 인식하기 (0) | 2021.09.26 |
|---|---|
| [수화 인식 프로젝트] 2주차 수업 _ opencv 에서 webcam 캡쳐하여 파일 저장하기_분명 오류는 안나는데 저장이 안될 때 (0) | 2021.09.15 |
| [수화 인식 프로젝트] 1주차 수업 _ opencv 이용하여 webcam 켜기 (0) | 2021.09.11 |