본문 바로가기
Python/OpenCV

[OpenCV] dlib 영상&캠 얼굴 랜드마크 (face landmark)

by hotelshoe 2022. 1. 3.
반응형

이전 포스팅에 이어 이번엔 영상 속 인물의 얼굴을 landmark 해보겠습니다.


소스코드

import numpy as np
import dlib
import cv2

RIGHT_EYE = list(range(36, 42))
LEFT_EYE = list(range(42, 48))
MOUTH = list(range(48, 68))
NOSE = list(range(27, 36))
EYEBROWS = list(range(17, 27))
JAWLINE = list(range(1, 17))
ALL = list(range(0, 68))
EYES = list(range(36, 48))

#-- 비디오파일, 데이터 파일 경로
vedio_path = './video.mp4'
predictor_file = './shape_predictor_68_face_landmarks.dat'
cam = 0

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_file)

#-- 비디오 파일 사용시 cam을 vedio_path로 변경
cap = cv2.VideoCapture(cam) 

while True:
    ret, image = cap.read()

    if not ret:
        break

    
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    rects = detector(gray, 1)

    for (i, rect) in enumerate(rects):
        points = np.matrix([[p.x, p.y] for p in predictor(gray, rect).parts()])
        show_parts = points[ALL]
        

        for (i, point) in enumerate(show_parts):
            x = point[0,0]
            y = point[0,1]
            cv2.circle(image, (x, y), 1, (0, 255, 255), -1)
            cv2.putText(image, "{}".format(i + 1), (x, y - 2),
            cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 255, 0), 1)
        
    #-- 현재 인식된 얼굴 수를 화면에 출력
    cv2.putText(image, "Number of faces detected: {}".format(len(rects)) , (10,460), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2)
    cv2.imshow('detect', image)
    
    #-- q 입력시 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

 


테스트

 

뉴스 영상에 적용시킨 모습

인식에는 큰 문제가 없어 보이나 프레임 문제인지 GPU를 연동시키지 못해서인지 모르겠지만 느린 화면으로 출력되어 나온다

 

캠 화면에서의 인식

동영상과 마찬가지로 인식 성능에는 큰 이상이 없어 보인다.

반응형

댓글