ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • dlib + OpenCV + Python을 이용, 실시간으로 얼굴 및 눈 인식하는 법
    study/영상처리 2018. 9. 25. 17:22

    dlib + OpenCV + Python을 이용, 실시간으로 얼굴 및 눈 인식하는 법



     dlib Landmark points 활용


    이번엔 haar를 이용한 방법이 아닌 dlib에 정의된 68개의 랜드마크 포인트를 활용하여 얼굴의 구조(?)를 파악하는 방법

    미리 dlib 라이브러리를 설치 해야함, 코드 치는 것보다 설치하는 게 더 귀찮으니까 알아서 설치 하세욥


    dlib를 설치한 후에는 dlib에서 사용할 shape predictor의 dat파일을 다운로드


    shape_predictor_68_face_landmarks.dat 다운 링크 https://osdn.net/projects/sfnet_dclib/downloads/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2/




    dlib 설치 후 dat 다운 후 코드 작성 시작.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import numpy as np
    import cv2
    import dlib
     
    faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
     
    # 얼굴의 각 구역의 포인트들을 구분해 놓기
    JAWLINE_POINTS = list(range(017))
    RIGHT_EYEBROW_POINTS = list(range(1722))
    LEFT_EYEBROW_POINTS = list(range(2227))
    NOSE_POINTS = list(range(2736))
    RIGHT_EYE_POINTS = list(range(3642))
    LEFT_EYE_POINTS = list(range(4248))
    MOUTH_OUTLINE_POINTS = list(range(4861))
    MOUTH_INNER_POINTS = list(range(6168))
    cs


       OpenCV와 dlib 를 import

          그리고 다운 받은 shape_predictor_68_face_landmarks.dat를 불러온다. 얼굴용 haar도 !

          

          haar를 이용한 얼굴 및 눈 인식하는 방법

           http://studiou.tistory.com/entry/Haarcascade-opencv-python를-이용-실시간으로-얼굴-및-눈-인식-하는법 [studio u] 

          


         그리고 미리 얼굴의 구성요소들의 포인트들 범위를 지정해둔다



    얼굴에 Landmark 찾는 함수 작성



    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
    ""
        def = dlib를 이용 얼굴과 눈을 찾는 함수
        input = 그레이 스케일 이미지
        output = 얼굴 중요 68개의 포인트 에 그려진 점 + 이미지
    """
    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:
            # 오픈 CV 이미지를 dlib용 사각형으로 변환하고
            dlib_rect = dlib.rectangle(int(x), int(y), int(x + w), int(y + h))
            # 랜드마크 포인트들 지정
            landmarks = np.matrix([[p.x, p.y] for p in predictor(frame, dlib_rect).parts()])
            # 원하는 포인트들을 넣는다, 지금은 전부
            landmarks_display = landmarks[0:68]
            # 눈만 = landmarks_display = landmarks[RIGHT_EYE_POINTS, LEFT_EYE_POINTS]
     
            # 포인트 출력
            for idx, point in enumerate(landmarks_display):
                pos = (point[00], point[01])
                cv2.circle(frame, pos, 2, color=(0255255), thickness=-1)
     
        return frame
    cs


    =  haar를 통해 얼굴만 찾고, 그 얼굴 이미지에서 dlib 를 통해 68개의 랜드 마크 포인트들을 찾음

        

        찾은 포인트 출력 !



    전체 코드



    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
    57
    58
    59
    60
    61
    62
    63
    import numpy as np
    import cv2
    import dlib
     
    faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
     
    # 얼굴의 각 구역의 포인트들을 구분해 놓기
    JAWLINE_POINTS = list(range(017))
    RIGHT_EYEBROW_POINTS = list(range(1722))
    LEFT_EYEBROW_POINTS = list(range(2227))
    NOSE_POINTS = list(range(2736))
    RIGHT_EYE_POINTS = list(range(3642))
    LEFT_EYE_POINTS = list(range(4248))
    MOUTH_OUTLINE_POINTS = list(range(4861))
    MOUTH_INNER_POINTS = list(range(6168))
     
    ""
        def = dlib를 이용 얼굴과 눈을 찾는 함수
        input = 그레이 스케일 이미지
        output = 얼굴 중요 68개의 포인트 에 그려진 점 + 이미지
    """
    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:
            # 오픈 CV 이미지를 dlib용 사각형으로 변환하고
            dlib_rect = dlib.rectangle(int(x), int(y), int(x + w), int(y + h))
            # 랜드마크 포인트들 지정
            landmarks = np.matrix([[p.x, p.y] for p in predictor(frame, dlib_rect).parts()])
            # 원하는 포인트들을 넣는다, 지금은 전부
            landmarks_display = landmarks[0:68]
            # 눈만 = landmarks_display = landmarks[RIGHT_EYE_POINTS, LEFT_EYE_POINTS]
     
            # 포인트 출력
            for idx, point in enumerate(landmarks_display):
                pos = (point[00], point[01])
                cv2.circle(frame, pos, 2, color=(0255255), thickness=-1)
     
        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


    =     실시간 처리는 haar 때처럼 웹캠을 이용


Designed by Tistory.