본문 바로가기
Python/OpenCV

[OpenCV] dlib 이미지 얼굴 랜드마크 (face landmark)

by hotelshoe 2022. 1. 3.
반응형

 

Dlib는 C++로 작성된 크로스 플랫폼 머신러닝 SW 라이브러리로서 파이썬에서도 사용이 가능합니다.

 

 

 

출처: http://blog.dlib.net/

대표적인 기능으로 사람의 얼굴에 landmark를 포인팅합니다. 이번 예제 코드를 통해 이미지 속 인물들의 얼굴에 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))


#-- 데이터 파일과 이미지 파일 경로
predictor_file = './shape_predictor_68_face_landmarks.dat' #-- 자신의 개발 환경에 맞게 변경할 것
image_file = './img.jpg' #-- 자신의 개발 환경에 맞게 변경할 것

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

image = cv2.imread(image_file)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

rects = detector(gray, 1)
print("Number of faces detected: {}".format(len(rects)))


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.imshow("Face Landmark", image)
cv2.waitKey(0)

테스트

출력 예시
출력 예시

일반적인 인물의 사진을 이용하여 코드 적용 전, 후 입니다.

어느 정도의 인식 성능을 확인해 볼 수 있습니다.

 

출력 예시
출력 예시

또 다른 이미지 파일을 이용하여 적용한 결과

다음으로 영상에 적용하여 테스트 결과를 확인해볼 예정입니다.

반응형

댓글