본문 바로가기

논문

[정리]Rapid object detection using a boosted cascade of simple features(Viola-Jones algorithm) -번외 (feat. OpenCV)

논문 정리내용은 이전 포스팅을 참고해주세요!

 

[정리]Rapid object detection using a boosted cascade of simple features(Viola-Jones algorithm) -2

Abstract, Harr-feature와 Integral Image는 이전 포스팅을 참고해주세요! [정리]Rapid object detection using a boosted cascade of simple features(Viola-Jones algorithm) -1 Rapid object detection using a..

studyingfox.tistory.com


Viola-Jones in OpenCV

지난 포스팅들에서 살펴본 Viola-Jones 알고리즘은 아직까지도 얼굴인식에 많이 사용되며 알고리즘이 얼마나 잘 만들어졌는지 보여준다.

많이 쓰이는 알고리즘인만큼 이미 OpenCV에 함수로 구현이 되어있다.

 

 

그래서 이번 포스팅은 OpenCV 파이썬 튜토리얼 홈페이지에서 제공하는 Haar Cascade를 사용한 얼굴인식을 해보았다.

(자세한 내용은 아래 링크를 들어가주세요)

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html

 

Face Detection using Haar Cascades — OpenCV-Python Tutorials 1 documentation

Face Detection using Haar Cascades Goal In this session, We will see the basics of face detection using Haar Feature-based Cascade Classifiers We will extend the same for eye detection etc. Basics Object Detection using Haar feature-based cascade classifie

opencv-python-tutroals.readthedocs.io

Face Detection using Haar Cascades 튜토리얼은 얼굴 검출을 지원한다.

이번 포스팅은 정면과 눈 classifier를 사용하기 때문에 다른 객체를 검출하고 싶으면 기존에 있는 다른 객체를 검출하는 classifier를 사용하거나 직접 만든 classifier를 사용하면된다.


준비물

1.  미리 훈련된 정면과 눈 classifier

   ->OpenCV 깃허브에 있어서 다운로드 받으면 됩니다.

      haarcascade_eye.xmlhaarcascade_frontalcatface.xml를 다운받아주세요.

      https://github.com/opencv/opencv/tree/master/data/haarcascades ==>여기서 다운받을 수 있습니다. 

 

opencv/opencv

Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

github.com

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.35
 
#감지된 얼굴의 좌표를 생성
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

 

눈도 같이 감지가 되었다.


참고

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html