study/영상처리
Haarcascade + opencv + python를 이용, 실시간으로 얼굴 및 눈 인식 하는법
kingjake
2018. 9. 25. 14:39
Haarcascade + OpenCV를 이용하여 얼굴 및 눈 인식하는 법
Haarcascade Classifier 불러오기 |
Haarcascade 방식을 사용하려면 찾고자 하는 객체의 Haarcascade Classifier 다운 받고 불러와야 한다.
Haarcascade Classifier는 얼굴의 경우 얼굴에서 보여주는 패턴, 눈이면 눈이 보여주는 이미지 패턴을 정리 해놓은 것
OpenCV 에서 얼굴, 눈 외의 많은 것들을 이미 만들어서 xml 파일로 다운받을 수 있게 했으니 원하는 것을 알아서 다운로드
Haarcascade Classifier xml 다운 주소: https://github.com/opencv/opencv/tree/master/data/haarcascades
* 얼굴은 haarcascade_frontalface_default.xml
* 눈은 haarcascade_eye.xml
다운을 받았으면 코드 작성 시작 |
1 2 3 4 5 6 7 | import numpy as np import cv2 # 찾고자하는 것의 cascade classifier 를 등록 # 경로는 상대경로로 바뀔 수 있음 faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eyeCascade = cv2.CascadeClassifier('haarcascade_eye.xml') | cs |
= OpenCV를 import 하고 Cascade Classifier를 불러옴
얼굴과 눈을 찾는 함수를 만들기 |
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 | """ def = haar를 이용 얼굴과 눈을 찾는 함수 input = 그레이 스케일 이미지 output = 얼굴과 눈에 사각형이 그려진 이미지 프레임 """ 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: # 얼굴: 이미지 프레임에 (x,y)에서 시작, (x+넓이, y+길이)까지의 사각형을 그림(색 255 0 0 , 굵기 2) cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) # 이미지를 얼굴 크기 만큼 잘라서 그레이스케일 이미지와 컬러이미지를 만듬 face_gray = gray[y:y + h, x:x + w] face_color = frame[y:y + h, x:x + w] # 등록한 Cascade classifier 를 이용 눈을 찾음(얼굴 영역에서만) eyes = eyeCascade.detectMultiScale(face_gray, 1.1, 3) # 눈: 이미지 프레임에 (x,y)에서 시작, (x+넓이, y+길이)까지의 사각형을 그림(색 0 255 0 , 굵기 2) for (ex, ey, ew, eh) in eyes: cv2.rectangle(face_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) return frame | cs |
= 그레이 스케일 이미지를 입력 받고
그 이미지에서 얼굴을 찾은 후, 얼굴 부분에서 눈을 찾는 함수
웹캠으로 실시간 이미지 불러오기 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 웹캠에서 이미지 가져오기 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 |
= 웹캠을 이용 실시간으로 이미지를 불러 와서
앞에 만든 얼굴&눈 감지 함수를 돌려줌
전체 코드 .py |
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 | import numpy as np import cv2 # 찾고자하는 것의 cascade classifier 를 등록 # 경로는 상대경로로 바뀔 수 있음 faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eyeCascade = cv2.CascadeClassifier('haarcascade_eye.xml') """ def = haar를 이용 얼굴과 눈을 찾는 함수 input = 그레이 스케일 이미지 output = 얼굴과 눈에 사각형이 그려진 이미지 프레임 """ 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: # 얼굴: 이미지 프레임에 (x,y)에서 시작, (x+넓이, y+길이)까지의 사각형을 그림(색 255 0 0 , 굵기 2) cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) # 이미지를 얼굴 크기 만큼 잘라서 그레이스케일 이미지와 컬러이미지를 만듬 face_gray = gray[y:y + h, x:x + w] face_color = frame[y:y + h, x:x + w] # 등록한 Cascade classifier 를 이용 눈을 찾음(얼굴 영역에서만) eyes = eyeCascade.detectMultiScale(face_gray, 1.1, 3) # 눈: 이미지 프레임에 (x,y)에서 시작, (x+넓이, y+길이)까지의 사각형을 그림(색 0 255 0 , 굵기 2) for (ex, ey, ew, eh) in eyes: cv2.rectangle(face_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) 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 |