본문 바로가기
OpenCv/손가락 모션 인식

OpenCV python/ hsv 를 이용한 Skin 탐지

by 민주르륵 2019. 1. 19.

글쓰기 전에 앞서 공부할때 사용한 사이트들과 참고 코드들.

1. https://www.pyimagesearch.com/2016/04/11/finding-extreme-points-in-contours-with-opencv/

2. https://www.pyimagesearch.com/2014/08/18/skin-detection-step-step-example-using-python-opencv/

3. https://blog.naver.com/PostView.nhn?blogId=samsjang&logNo=220505815055&parentCategoryNo=&categoryNo=66&viewDate=&isShowPopularPosts=false&from=postView


기초가 된 코드는 출처 2번에서 들고왔다 (사실상 코드가 같음...)


먼저 사용할 라이브러리들을 import 해주자


import imutils
import numpy as np
import cv2


imutils - OpenCv의 부족한 기능들을 좀 더 보충해주는 모듈

numpy - 수학적 처리를 위한 모듈

cv2 - opencv를 사용하기 위한 모듈



Opencv를 사용하여 손을 탐지하는 방법은 다양하다


그중 가장 간단한, 색을 이용하여 피부색으로 손을 찾는 방법을 사용할 것이다


정확히는 피부를 찾는 방법이지만, 피부중에서 정확히 손을 검출하는 방법은 좀 더 복잡하고(곧 해야하지만)


우선적으로 HSV코드를 이용해 손을 찾아보기로 한다


lower = np.array([0, 48, 80], dtype = "uint8")
upper = np.array([20, 255, 255], dtype = "uint8")


Skin HSV 범위를 정해준다 


camera = cv2.VideoCapture(0)


실시간으로 손가락을 찾아내야 하므로 Webcam을 사용한다


while True:
    
    (grabbed, frame) = camera.read()
    # 프레임 크기를 조정, HSV 색으로 변환, lower upper 범위 HSV 픽셀 결정하기.
    converted = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 1
    skinMask = cv2.inRange(converted, lower, upper) 2
    # 경계선 찾아주는애
    kernel = (cv2.MORPH_ELLIPSE, (11, 11)) 3 #타원 모양으로 매트릭스 생성
    skinMask = cv2.dilate(skinMask, kernel, iterations = 1) 4 #SkinMask의 iterations를 두번 반복(잡힌 범위 주변 margin이 뚱뚱해진다)
    skinMask = cv2.GaussianBlur(skinMask, (3, 3), 0) 5
    
    _,line,_ = cv2.findContours(skinMask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 6
    cv2.drawContours(frame, line, -1, (0,255,0), 3) 7 #(라인을 그릴 이미지, 검출된 컨투어, 음수로 지정할경우 모든 컨투어,색상지정(현재는 초록),선두께)
    cv2.imshow("images",frame) 8
    # q누르면 종료
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break


번호에 해당하는 코드들 설명이다.

필자도 배우는 사람이므로 코드의 설명이 정확하지 않기때문에 맞다고 확신하지말자.


1. HSV 색상을 사용하기 위해 BGR을 변환시켜준다

2. frame에서 lower에서 upper까지의 범위 

3. 11x11 원모양의 커널 매트릭스 생성

4. skinMask 형태를 1만큼 늘려 범위를 좀 더 넓게 잡아준다.(정확한 표현은 아님)

5. skinMask에 가우시안블러 적용

6. findContours를 이용해 경계선을 찾는다

7. frame(웹캠)에 선을 그려준다

8. frame 창을 띄운다



최종코드------------


import numpy as np
import cv2
# HSV pixel의 lower과 upper 경계값 정의/스킨 색 경계값 설정
# 'skin'의 범위 값 설정
lower = np.array([0, 48, 80], dtype = "uint8")
upper = np.array([20, 255, 255], dtype = "uint8")

camera = cv2.VideoCapture(0)

while True:
    
    (grabbed, frame) = camera.read()

    converted = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    skinMask = cv2.inRange(converted, lower, upper)
    # 경계선 찾아주는애
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11, 11))#타원 모양으로 매트리스 생성
    skinMask = cv2.dilate(skinMask, kernel, iterations = 1)#SkinMask의 iterations를 두번 반복(잡힌 범위 주변 margin이 뚱뚱해진다)
    skinMask = cv2.GaussianBlur(skinMask, (3, 3), 0)
    
    _,line,_ = cv2.findContours(skinMask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(frame, line, -1, (0,255,0), 3)#(라인을 그릴 이미지, 검출된 컨투어, 음수로 지정할경우 모든 컨투어,색상지정(현재는 초록),선두께)
    cv2.imshow("images",frame)
    # q누르면 종료
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

camera.release()
cv2.destroyAllWindows()



결과




뒷배경이 많이 방해되서(+얼굴) 종이로 배경을 가렸다, 화장품을 보여주는 뷰티유투버가 된것같다.


보시다시피 손보다 약간 붕 뜬 경계선이 만들어졌다.


다음엔 이 검출된 손의 꼭짓점. 즉 손끝을 탐지하는 코드를 공부해와야겠다.



'OpenCv > 손가락 모션 인식' 카테고리의 다른 글

OpenCV python 가상 키보드 생성 및 입력받기  (0) 2019.05.13
OpenCv python 도전기  (0) 2019.01.19