-
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 다운 후 코드 작성 시작.
12345678910111213141516import numpy as npimport cv2import dlibfaceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# 얼굴의 각 구역의 포인트들을 구분해 놓기JAWLINE_POINTS = list(range(0, 17))RIGHT_EYEBROW_POINTS = list(range(17, 22))LEFT_EYEBROW_POINTS = list(range(22, 27))NOSE_POINTS = list(range(27, 36))RIGHT_EYE_POINTS = list(range(36, 42))LEFT_EYE_POINTS = list(range(42, 48))MOUTH_OUTLINE_POINTS = list(range(48, 61))MOUTH_INNER_POINTS = list(range(61, 68))cs = OpenCV와 dlib 를 import
그리고 다운 받은 shape_predictor_68_face_landmarks.dat를 불러온다. 얼굴용 haar도 !
haar를 이용한 얼굴 및 눈 인식하는 방법
http://studiou.tistory.com/entry/Haarcascade-opencv-python를-이용-실시간으로-얼굴-및-눈-인식-하는법 [studio u]
그리고 미리 얼굴의 구성요소들의 포인트들 범위를 지정해둔다
얼굴에 Landmark 찾는 함수 작성
12345678910111213141516171819202122232425"""def = dlib를 이용 얼굴과 눈을 찾는 함수input = 그레이 스케일 이미지output = 얼굴 중요 68개의 포인트 에 그려진 점 + 이미지"""def detect(gray,frame):# 일단, 등록한 Cascade classifier 를 이용 얼굴을 찾음faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=5, minSize=(100, 100), 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[0, 0], point[0, 1])cv2.circle(frame, pos, 2, color=(0, 255, 255), thickness=-1)return framecs = haar를 통해 얼굴만 찾고, 그 얼굴 이미지에서 dlib 를 통해 68개의 랜드 마크 포인트들을 찾음
찾은 포인트 출력 !
전체 코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263import numpy as npimport cv2import dlibfaceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# 얼굴의 각 구역의 포인트들을 구분해 놓기JAWLINE_POINTS = list(range(0, 17))RIGHT_EYEBROW_POINTS = list(range(17, 22))LEFT_EYEBROW_POINTS = list(range(22, 27))NOSE_POINTS = list(range(27, 36))RIGHT_EYE_POINTS = list(range(36, 42))LEFT_EYE_POINTS = list(range(42, 48))MOUTH_OUTLINE_POINTS = list(range(48, 61))MOUTH_INNER_POINTS = list(range(61, 68))"""def = dlib를 이용 얼굴과 눈을 찾는 함수input = 그레이 스케일 이미지output = 얼굴 중요 68개의 포인트 에 그려진 점 + 이미지"""def detect(gray,frame):# 일단, 등록한 Cascade classifier 를 이용 얼굴을 찾음faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=5, minSize=(100, 100), 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[0, 0], point[0, 1])cv2.circle(frame, pos, 2, color=(0, 255, 255), 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 때처럼 웹캠을 이용
'study > 영상처리' 카테고리의 다른 글
Haarcascade + opencv + python를 이용, 실시간으로 얼굴 및 눈 인식 하는법 (5) 2018.09.25