Python OpenCV를 사용한 간단한 얼굴 위치 인식 예제 코드
Face ID와 같은 보안이나, SNOW 같은 카메라 app에서 얼굴을 변형하거나 이미지를 보정하는 분야까지 얼굴 인식은 현재 많은 분야에 사용되고 있다. 본 포스트는 Python에서 OpenCV를 사용하여 얼굴의 위치를 감지하고, 그 위에 다른 이미지를 그리는 예제를 담고 있다.
OpenCV 튜토리얼 중 카메라 haar cascade classifier를 사용해 영상에서 사람의 얼굴 위치를 감지하는 예제가 있다.
https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html
Haar feature-based cascade classifier를 사용한 객체 감지는 Paul Viola와 Michael Jones의 논문 “Rapid Object Detection using a Boosted Cascade of Simple Features”에서 제안한 객체 감지 방법이라고 한다. 이는 검출하고자 하는 객체 이미지와 그 객체가 없는 이미지를 훈련시킨 후 다른 이미지에서 원하는 객체를 감지하는 일종의 머신 러닝의 방식이라고 한다.
OpenCV를 사용하여 얼굴 위치를 인식하는 순서는 다음과 같다.
1. cv.CascadeClassifier를 사용하여
cascade classifier를 생성한다.
2. cv.CascadeClassifier.load를 사용하여
훈련된 모델의 xml파일을 로드 한다.
3. Cv.CascadeClassifier.detectMultiScale을 사용하여 이미지에서 얼굴의 위치를
감지한다.
객체 검출 모델은 훈련을 통해 만들 수 있다. (https://docs.opencv.org/master/dc/d88/tutorial_traincascade.html)
OpencCV에서는 이미 학습된 얼굴 감지 모델을 제공하고 있고, Anaconda의 경우 Anaconda3\Library\etc\haarcascades\에 해당 xml파일이 존재한다.
이를 이용해 카메라 영상에서 얼굴을 감지해 그 위에 다른 이미지를 그리는 예제 코드는 다음과 같다.
import cv2 as cv
import numpy as np
def drawImage(frame, img, x,y,w,h,colorkey):
resized_img = cv.resize(img,None,fx=w/img.shape[1]
,fy=h/img.shape[0],interpolation = cv.INTER_NEAREST)
def check_color(color, mask, offset=20):
if color[0] >= mask[0]-offset and color[1]
>= mask[1]-offset and color[2] >= mask[2]-offset:
return True
return False
for i in range(h):
for j in range(w):
if
check_color(resized_img[i,j],colorkey) is False:
frame[y+i,x+j] =
resized_img[i,j]
def main():
face_cascade = cv.CascadeClassifier()
if not
face_cascade.load('C:\Anaconda3\Library\etc\haarcascades\haarcascade_frontalface_alt.xml'):
return
cap = cv.VideoCapture(0)
img = cv.imread('face.jpg')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
frame_gray = cv.equalizeHist(frame_gray)
#detect face
faces = face_cascade.detectMultiScale(frame_gray)
for (x,y,w,h) in faces:
drawImage(frame,img,x,y,w,h,np.array([ 255,255,255 ], dtype=img.dtype))
cv.imshow('video', frame)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
if __name__ == "__main__":
main()
위 예제 코드를 실행하면 아래와 같이 얼굴을 감지하는 것을 볼 수 있다.
댓글
댓글 쓰기