Python 사진 얼굴 인식 검출 예제 OpenCV

파이썬 OpenCV를 사용해 사진에서 얼굴과 눈을 찾아내는 예제를 살펴보겠습니다.

먼저 얼굴과 눈을 인식할 수 있도록 인물 사진을 준비하겠습니다.

 

얼굴과 눈을 인식하는 예제 소스입니다.

import cv2

face_cascade = cv2.CascadeClassifier('C:/Users/Administrator/PycharmProjects/numpytest/venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('C:/Users/Administrator/PycharmProjects/numpytest/venv/Lib/site-packages/cv2/data/haarcascade_eye.xml')

src = cv2.imread('C:/Users/Administrator/Desktop/python/origin/face.jpg')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray,1.1,3)

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]
    eyes = eye_cascade.detectMultiScale(face_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

cv2.imwrite('C:/Users/Administrator/Desktop/python/origin/face_cascade.jpg', src)

 

결과

 

얼굴에는 파란색 사각형이, 눈에는 초록색 사각형이 생겼습니다.

소스에서 중요한 부분들을 살펴보겠습니다.

face_cascade 변수에 xml 파일을 설정했습니다.

OpenCV를 설치하면 반복 학습을 시켜놓은 파일이 생성이 됩니다.

OpenCV 폴더를 살펴보면 미리 학습이 되어 있는 xml 파일들이 미리 준비되어 있습니다.

준비되어 있는 xml을 이용해 사진에서 인물이나 사물들을 찾아낼 수 있습니다. 

cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

 

CascadeClassifier에 설정하고 싶은 xml 파일을 지정해 주면 되지만, 경우에 따라 파일을 못 읽어 들이는 경우도 있습니다.

그런 경우에는 파일이 있는 경로를 전부 작성해 주면 파일을 불러옵니다.

eye_cascade 변수에는 눈을 인식할 수 있는 xml 파일을 설정했습니다.

haarcascade_eye.xml 파일은 눈을 인식해 검출해 줍니다.

detectMultiScale()은 가장 중요한 부분이라고 볼 수 있습니다.

얼굴을 인식해 검출을 하는 부분입니다.

얼굴과 눈을 검출하도록 xml 파일을 설정한 변수에서  detectMultiScale()를 호출하여 실행합니다.

 

인수는 3개를 지정합니다.

첫 번째 인수는 사진 정보를 전달합니다.

두 번째, 세 번째 인수는 생략 가능합니다.

 

두 번째 인수는 scaleFactor로 사진에서 얼굴이나 눈등 지정한 형태를 찾을 정밀도를 의미합니다.

기본값은 1.1이며 숫자가 낮을수록 정밀하게 찾습니다.

 

세 번째 인수는 minNeighbors로 얼굴 사이의 최소 간격을 의미합니다.

기본값은 3입니다.

너무 낮은 값을 사용하면 중복돼서 검출되기도 합니다.

 

두 번째 인수인 scaleFactor와 세 번째 인수인 minNeighbors는 사진에 따라 설정을 변경해야 제대로 인식을 하는 경우가 있으니 조절해가면서 사용하는 것이 좋습니다.

하지만 기본값으로도 어느 정도 얼굴과 눈을 인식해 검출해 주기 때문에 크게 변경을 하지 않아도 될 거 같습니다.

댓글