-
Haarcascade + opencv + python를 이용, 실시간으로 얼굴 및 눈 인식 하는법study/영상처리 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
다운을 받았으면 코드 작성 시작
1234567import numpy as npimport cv2# 찾고자하는 것의 cascade classifier 를 등록# 경로는 상대경로로 바뀔 수 있음faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')eyeCascade = cv2.CascadeClassifier('haarcascade_eye.xml')cs = OpenCV를 import 하고 Cascade Classifier를 불러옴
얼굴과 눈을 찾는 함수를 만들기
123456789101112131415161718192021222324252627"""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 framecs = 그레이 스케일 이미지를 입력 받고
그 이미지에서 얼굴을 찾은 후, 얼굴 부분에서 눈을 찾는 함수
웹캠으로 실시간 이미지 불러오기
1234567891011121314151617181920# 웹캠에서 이미지 가져오기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
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556import numpy as npimport 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 'study > 영상처리' 카테고리의 다른 글
dlib + OpenCV + Python을 이용, 실시간으로 얼굴 및 눈 인식하는 법 (4) 2018.09.25