신기술 습득
[Object Detection] 2. 이미지를 이용한 얼굴/눈인식
테리베리
2021. 9. 5. 19:57
728x90
반응형
1. 간단한 이론
Haar-cascade: 영상/이미지에서 오브젝트를 검출위해 사용, 직사각형 영역으로 구성되는 특징을 사용하기 때문에 픽셀을 직접 사용할 때 보다 동작 속도가 빠름
자세한 내용은 https://webnautes.tistory.com/1352 를 참조합시다.
2. 이미지를 이용한 얼굴/눈인식
import cv2
import numpy as np
import os
def detectAndDisplay(frame):
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame_gray = cv2.equalizeHist(frame_gray)
#-- Detect faces
faces = face_cascade.detectMultiScale(frame_gray)
for (x,y,w,h) in faces:
center = (x + w//2, y + h//2)
frame = cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 4)
faceROI = frame_gray[y:y+h,x:x+w]
#-- In each face, detect eyes
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 = cv2.circle(frame, eye_center, radius, (255, 0, 0 ), 4)
cv2.imshow('Capture - Face detection', frame)
data_root = 'D:/Computer Vision/ai_cv/image/'
cascade_root = 'D:/Computer Vision/ai_cv/haarcascades/'
img = cv2.imread(data_root+"marathon_03.jpg")
#img = cv2.resize(img, dsize=(500, 400), interpolation=cv2.INTER_AREA)
print("width: {} pixels".format(img.shape[1])) # 가로 픽셀의 수
print("height: {} pixels".format(img.shape[0])) # 세로 픽셀의 수
print("channel: {}".format(img.shape[2])) # 채널 수
(height, width) = img.shape[:2]
cv2.imshow("Original Image", img)
face_cascade_name = cascade_root+'haarcascade_frontalface_alt.xml'
eyes_cascade_name = cascade_root+'haarcascade_eye_tree_eyeglasses.xml'
face_cascade = cv2.CascadeClassifier()
eyes_cascade = cv2.CascadeClassifier()
#-- 1. Load the cascades
if not face_cascade.load(cv2.samples.findFile(face_cascade_name)):
print('--(!) Error loading face cascade')
exit(0)
if not eyes_cascade.load(cv2.samples.findFile(eyes_cascade_name)):
print('--(!) Error loading eyes cascade')
exit(0)
detectAndDisplay(img)
cv2.waitKey(0)
cv2.destroyAllWindows()
haarcascade_eye_tree_eyeglasses.xml
0.57MB
haarcascade_frontalface_alt.xml
0.65MB
728x90
반응형