본문 바로가기
Python/OpenCV

[OpenCV] 영상 얼굴인식: 얼굴&눈 (Haar-cascade)

by hotelshoe 2021. 12. 29.
반응형

OpenCV에서 제공되는 haarcascade_frontalface_alt.xml 과 haarcascade_eye_tree_eyeglasses.xml 를 활용하여
영상속 얼굴과 눈을 인식합니다. 데이터 파일의 경우 OpenCV 다운로드시 기본적으로 제공되나, 아래의 링크에서 개별적으로 다운로드 가능합니다. 

 

https://github.com/opencv/opencv

 

GitHub - opencv/opencv: Open Source Computer Vision Library

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

github.com

위 링크를 통해 접속시 아래와 같은 화면을 보실 수 있습니다.

위 왼쪽 화면에서 빨간 박스가 된 code를 클릭시, 오른쪽 화면과 같이 선택창이 뜨는데 Download ZIP을 클릭하여 소스코드를 다운받습니다.

 

해당 ZIP 파일을 압축해제 한 뒤 data -> haarcascades 폴더에 이번 예제에 필요한 haarcascade_frontalface_alt.xmlhaarcascade_eye_tree_eyeglasses.xml 파일이 있습니다.

 


소스코드

from __future__ import print_function
import cv2 as cv
import argparse
def detectAndDisplay(frame):
    frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    frame_gray = cv.equalizeHist(frame_gray)
    #-- 얼굴 탐지
    faces = face_cascade.detectMultiScale(frame_gray)
    for (x,y,w,h) in faces:
        center = (x + w//2, y + h//2)
        frame = cv.ellipse(frame, center, (w//2, h//2), 0, 0, 360, (255, 0, 255), 4)
        faceROI = frame_gray[y:y+h,x:x+w]
        #-- 얼굴에서 눈 탐지
        eyes = eyes_cascade.detectMultiScale(faceROI)
        for (x2,y2,w2,h2) in eyes:
            eye_center = (x + x2 + w2//2, y + y2 + h2//2)
            radius = int(round((w2 + h2)*0.25))
            frame = cv.circle(frame, eye_center, radius, (255, 0, 0 ), 4)
    cv.imshow('Capture - Face detection', frame)
parser = argparse.ArgumentParser(description='Code for Cascade Classifier tutorial.')
#-- 데이터 파일 경로(본인 환경에 맞게 변경)
parser.add_argument('--face_cascade', help='Path to face cascade.', default='data/haarcascades/haarcascade_frontalface_alt.xml')
parser.add_argument('--eyes_cascade', help='Path to eyes cascade.', default='data/haarcascades/haarcascade_eye_tree_eyeglasses.xml')
parser.add_argument('--camera', help='Camera divide number.', type=int, default=0)
args = parser.parse_args()
face_cascade_name = args.face_cascade
eyes_cascade_name = args.eyes_cascade
face_cascade = cv.CascadeClassifier()
eyes_cascade = cv.CascadeClassifier()

#-- 데이터 파일 읽어오기
if not face_cascade.load(cv.samples.findFile(face_cascade_name)):
    print('--(!)Error loading face cascade')
    exit(0)
if not eyes_cascade.load(cv.samples.findFile(eyes_cascade_name)):
    print('--(!)Error loading eyes cascade')
    exit(0)
camera_device = args.camera

#-- 비디오 or 캠 불러오기
cap = cv.VideoCapture(camera_device)
if not cap.isOpened:
    print('--(!)Error opening video capture')
    exit(0)
while True:
    ret, frame = cap.read()
    if frame is None:
        print('--(!) No captured frame -- Break!')
        break
    detectAndDisplay(frame)

#-- q 입력시 종료
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

 


테스트

출력 예시

드라마 장면을 대상으로 테스트한 결과

대체적으로 잘 인식하는 것을 볼 수 있다.

 

출력 예시

캠 영상 테스트의 캡쳐 사진(얼굴은 모자이크로 조금 가렸습니다..)

캠 화면의 얼굴도 어느 정도 잘 인식하는 듯합니다.

출력 예시

휴대전화 속 사진의 얼굴 또한 인식되는 것을 볼 수 있습니다.

반응형

댓글