study/영상처리

Haarcascade + opencv + python를 이용, 실시간으로 얼굴 및 눈 인식 하는법

kingjake 2018. 9. 25. 14:39

Haarcascade + OpenCV를 이용하여 얼굴 및 눈 인식하는 법





Haarcascade Classifier 불러오기



Haarcascade 방식을 사용하려면 찾고자 하는 객체의 Haarcascade Classifier 다운 받고 불러와야 한다.


Haarcascade Classifier는 얼굴의 경우 얼굴에서 보여주는 패턴, 눈이면 눈이 보여주는 이미지 패턴을 정리 해놓은 것


OpenCV 에서 얼굴, 눈 외의 많은 것들을 이미 만들어서 xml 파일로 다운받을 수 있게 했으니 원하는 것을 알아서 다운로드 


Haarcascade Classifier xml 다운 주소: https://github.com/opencv/opencv/tree/master/data/haarcascades


* 얼굴은 haarcascade_frontalface_default.xml 

* 눈은 haarcascade_eye.xml 





 다운을 받았으면 코드 작성 시작


1
2
3
4
5
6
7
import numpy as np
import cv2
 
# 찾고자하는 것의 cascade classifier 를 등록
# 경로는 상대경로로 바뀔 수 있음
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eyeCascade = cv2.CascadeClassifier('haarcascade_eye.xml')
cs


=     OpenCV를 import 하고 Cascade Classifier를 불러옴



얼굴과 눈을 찾는 함수를 만들기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
""
    def = haar를 이용 얼굴과 눈을 찾는 함수
    input = 그레이 스케일 이미지
    output = 얼굴과 눈에 사각형이 그려진 이미지 프레임
"""
def detect(gray,frame):
 
    # 등록한 Cascade classifier 를 이용 얼굴을 찾음
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=5, minSize=(100100),flags=cv2.CASCADE_SCALE_IMAGE)
 
    # 얼굴에 사각형을 그리고 눈을 찾자
    for (x, y, w, h) in faces:
        # 얼굴: 이미지 프레임에 (x,y)에서 시작, (x+넓이, y+길이)까지의 사각형을 그림(색 255 0 0 , 굵기 2)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (25500), 2)
 
        # 이미지를 얼굴 크기 만큼 잘라서 그레이스케일 이미지와 컬러이미지를 만듬
        face_gray = gray[y:y + h, x:x + w]
        face_color = frame[y:y + h, x:x + w]
 
        # 등록한 Cascade classifier 를 이용 눈을 찾음(얼굴 영역에서만)
        eyes = eyeCascade.detectMultiScale(face_gray, 1.13)
 
        # 눈: 이미지 프레임에 (x,y)에서 시작, (x+넓이, y+길이)까지의 사각형을 그림(색 0 255 0 , 굵기 2)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(face_color, (ex, ey), (ex + ew, ey + eh), (02550), 2)
 
    return frame
cs


=    그레이 스케일 이미지를 입력 받고 

      그 이미지에서 얼굴을 찾은 후, 얼굴 부분에서 눈을 찾는 함수


 웹캠으로 실시간 이미지 불러오기 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 웹캠에서 이미지 가져오기
video_capture = cv2.VideoCapture(0)
 
while True:
    # 웹캠 이미지를 프레임으로 자름
    _, frame = video_capture.read()
    # 그리고 이미지를 그레이스케일로 변환
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    # 만들어준 얼굴 눈 찾기
    canvas = detect(gray, frame)
    # 찾은 이미지 보여주기
    cv2.imshow("haha", canvas)
 
    # q를 누르면 종료
    if cv2.waitKey(1& 0xFF == ord('q'):
        break
# 끝
video_capture.release()
cv2.destroyAllWindows()
cs


=     웹캠을 이용 실시간으로 이미지를 불러 와서

       앞에 만든 얼굴&눈 감지 함수를 돌려줌


전체 코드 .py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import numpy as np
import cv2
 
# 찾고자하는 것의 cascade classifier 를 등록
# 경로는 상대경로로 바뀔 수 있음
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eyeCascade = cv2.CascadeClassifier('haarcascade_eye.xml')
 
""
    def = haar를 이용 얼굴과 눈을 찾는 함수
    input = 그레이 스케일 이미지
    output = 얼굴과 눈에 사각형이 그려진 이미지 프레임
"""
def detect(gray,frame):
 
    # 등록한 Cascade classifier 를 이용 얼굴을 찾음
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=5, minSize=(100100),flags=cv2.CASCADE_SCALE_IMAGE)
 
    # 얼굴에 사각형을 그리고 눈을 찾자
    for (x, y, w, h) in faces:
        # 얼굴: 이미지 프레임에 (x,y)에서 시작, (x+넓이, y+길이)까지의 사각형을 그림(색 255 0 0 , 굵기 2)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (25500), 2)
 
        # 이미지를 얼굴 크기 만큼 잘라서 그레이스케일 이미지와 컬러이미지를 만듬
        face_gray = gray[y:y + h, x:x + w]
        face_color = frame[y:y + h, x:x + w]
 
        # 등록한 Cascade classifier 를 이용 눈을 찾음(얼굴 영역에서만)
        eyes = eyeCascade.detectMultiScale(face_gray, 1.13)
 
        # 눈: 이미지 프레임에 (x,y)에서 시작, (x+넓이, y+길이)까지의 사각형을 그림(색 0 255 0 , 굵기 2)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(face_color, (ex, ey), (ex + ew, ey + eh), (02550), 2)
 
    return frame
 
# 웹캠에서 이미지 가져오기
video_capture = cv2.VideoCapture(0)
 
while True:
    # 웹캠 이미지를 프레임으로 자름
    _, frame = video_capture.read()
    # 그리고 이미지를 그레이스케일로 변환
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    # 만들어준 얼굴 눈 찾기
    canvas = detect(gray, frame)
    # 찾은 이미지 보여주기
    cv2.imshow("haha", canvas)
 
    # q를 누르면 종료
    if cv2.waitKey(1& 0xFF == ord('q'):
        break
# 끝
video_capture.release()
cv2.destroyAllWindows()
cs