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.xml 과 haarcascade_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
테스트
드라마 장면을 대상으로 테스트한 결과
대체적으로 잘 인식하는 것을 볼 수 있다.
캠 영상 테스트의 캡쳐 사진(얼굴은 모자이크로 조금 가렸습니다..)
캠 화면의 얼굴도 어느 정도 잘 인식하는 듯합니다.
휴대전화 속 사진의 얼굴 또한 인식되는 것을 볼 수 있습니다.
'Python > OpenCV' 카테고리의 다른 글
[OpenCV] cvlib 이미지 인물 얼굴 모자이크 (0) | 2022.02.07 |
---|---|
[OpenCV] putText 파라미터 (0) | 2022.01.03 |
[OpenCV] 광 흐름 탐지 - optical flow detection (0) | 2022.01.03 |
[OpenCV] dlib 영상&캠 얼굴 랜드마크 (face landmark) (0) | 2022.01.03 |
[OpenCV] dlib 이미지 얼굴 랜드마크 (face landmark) (0) | 2022.01.03 |
댓글