ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Haarcascade + opencv + python를 이용, 실시간으로 얼굴 및 눈 인식 하는법
    study/영상처리 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




Designed by Tistory.