논문 정리내용은 이전 포스팅을 참고해주세요!
Viola-Jones in OpenCV
지난 포스팅들에서 살펴본 Viola-Jones 알고리즘은 아직까지도 얼굴인식에 많이 사용되며 알고리즘이 얼마나 잘 만들어졌는지 보여준다.
많이 쓰이는 알고리즘인만큼 이미 OpenCV에 함수로 구현이 되어있다.
그래서 이번 포스팅은 OpenCV 파이썬 튜토리얼 홈페이지에서 제공하는 Haar Cascade를 사용한 얼굴인식을 해보았다.
(자세한 내용은 아래 링크를 들어가주세요)
Face Detection using Haar Cascades 튜토리얼은 얼굴과 눈 검출을 지원한다.
이번 포스팅은 정면과 눈 classifier를 사용하기 때문에 다른 객체를 검출하고 싶으면 기존에 있는 다른 객체를 검출하는 classifier를 사용하거나 직접 만든 classifier를 사용하면된다.
준비물
1. 미리 훈련된 정면과 눈 classifier
->OpenCV 깃허브에 있어서 다운로드 받으면 됩니다.
haarcascade_eye.xml과 haarcascade_frontalcatface.xml를 다운받아주세요.
https://github.com/opencv/opencv/tree/master/data/haarcascades ==>여기서 다운받을 수 있습니다.
2. 검출하고자 하는 사람이 있는 사진
->이미 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
|
import cv2
#미리 훈련된 classifier
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade=cv2.CascadeClassifier('haarcascade_eye.xml')
img=cv2.imread('이미지파일이름.jpg') #이미지 불러오기
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #이미지를 BGR에서 gray 스케일로 바꾸기
#classifier로 이미지에서 얼굴 검출
faces=face_cascade.detectMultiScale(gray, 1.3, 5)
#감지된 얼굴의 좌표를 생성
for(x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) #얼굴 박스 생성
roi_gray=gray[y:y+h, x:x+w] ##눈 감지를 위한 ROI 생성
roi_color=img[y:y+h, x:x+w]
eyes=eye_cascade.detectMultiScale(roi_gray) #눈 검출
for (ex,ey,ew,eh) in eyes: #눈 감지 박스 생성
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) #눈 박스 생성
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
|
cs |
실행결과
같은 사진이지만 픽셀이 다른 사진 2장으로 코드를 돌려봤다.
그랬더니 픽셀이 높을 수록 더 감지가 잘 된다는 (어쩌면 당연한,,,) 결과가 나왔다.
이미지는 Pixabay에서 여러명이 있는 사진을 다운받았다.
640*426
1280×853
참고