python / dlib과 cv2를 이용한 얼굴 랜드마크 검출

Geewon Kim·2023년 3월 14일
0

opencv

목록 보기
2/6

OpenCV로 얼굴검출하기

얼굴의 랜드마크를 검출하는 라이브러리인 dlib을 이용하여 얼굴에 점찍어보기
dlib의 get_frontal_face_detector 함수로 얼굴 디텍터를 불러오고, shape_predictor를 이용하여 얼굴의 특장점을 뽑아낸다. 전체 인덱스를 68개로 눈, 눈썹, 코, 턱, 입술라인에 좌표를 찍고 이를 점으로 변환해서 출력하면 끝

코드

import dlib
import cv2 as cv
import numpy as np


face_det = dlib.get_frontal_face_detector()
landmark_model = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")


# range는 끝값이 포함안됨
ALL = list(range(0, 68))
RIGHT_EYEBROW = list(range(17, 22))
LEFT_EYEBROW = list(range(22, 27))
RIGHT_EYE = list(range(36, 42))
LEFT_EYE = list(range(42, 48))
NOSE = list(range(27, 36))
MOUTH_OUTLINE = list(range(48, 61))
MOUTH_INNER = list(range(61, 68))
JAWLINE = list(range(0, 17))
index = ALL


if __name__ == "__main__":
    src = cv.imread("input.jpg")
    grey = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

	# 얼굴검출
    faces = face_det(grey)

    for face in faces:
        # 랜드마크 검출
        lm = landmark_model(src, face)

        lm_point = []
        for p in lm.parts():
            lm_point.append([p.x, p.y])
        lm_point = np.array(lm_point)

        for p in lm_point:
            cv.circle(src, (p[0], p[1]), radius=2, color=(255,0,0), thickness=2)


    cv.imshow("lsh", src)
    cv.waitKey()
    cv.destroyAllWindows()

눈썹이 앞머리때문에 가려져서 살짝 더 위로 잡히긴했지만 아무튼 완성
요 좌표값을 이용해서 snow 처럼 얼굴에 이미지를 씌우거나 화장을 씌우는것도 가능!

덧 1)
특정 몇개의 동그라미에만 다른 색상을 넣을 수 있고

cv.circle(src, (lm_point[36][0], lm_point[36][1]), radius=2, color=(0, 0, 255), thickness=2)
cv.circle(src, (lm_point[45][0], lm_point[45][1]), radius=2, color=(0, 0, 255), thickness=2)
cv.circle(src, (lm_point[33][0], lm_point[33][1]), radius=2, color=(0, 0, 255), thickness=2)

덧 2)
이미 얼굴을 검출했기 때문에 당연히 네모박스도 추가할수 있다.

#얼굴에 네모 박스도 쳐보기
cv.rectangle(src, (face.left(), face.top()), (face.right(), face.bottom()), color=(0,255,0), thickness=2)

덧 3)
잘생긴 사람 얼굴로 하면 공부가 조금 더 재밌다..

profile
내 지식의 외장하드

0개의 댓글