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()


위 예제 코드를 실행하면 아래와 같이 얼굴을 감지하는 것을 볼 수 있다.

 



댓글

이 블로그의 인기 게시물

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

base64 인코딩 디코딩 예제 c 소스

간단한 칼만 필터(Kalman Filter) 소스 코드와 사용 예제