import cv2
import numpy as np
import os, glob
# ๋ณ์ ์ค์ ---โ
base_dir = './faces'
min_accuracy = 85
# LBP ์ผ๊ตด ์ธ์๊ธฐ ๋ฐ ์ผ์ค์ผ์ด๋ ์ผ๊ตด ๊ฒ์ถ๊ธฐ ์์ฑ ๋ฐ ํ๋ จ ๋ชจ๋ธ ์ฝ๊ธฐ ---โก
face_classifier = cv2.CascadeClassifier(\
'./data/haarcascade_frontalface_default.xml')
model = cv2.face.LBPHFaceRecognizer_create()
model.read(os.path.join(base_dir, 'all_face.xml'))
# ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์์ด๋ ๋งคํ ์ ๋ณด ์์ฑ ---โข
dirs = [d for d in glob.glob(base_dir+"/*") if os.path.isdir(d)]
names = dict([])
for dir in dirs:
dir = os.path.basename(dir)
name, id = dir.split('_')
names[int(id)] = name
# ์นด๋ฉ๋ผ ์บก์ฒ ์ฅ์น ์ค๋น
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("no frame")
break
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
# ์ผ๊ตด ๊ฒ์ถ ---โฃ
faces = face_classifier.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
# ์ผ๊ตด ์์ญ ํ์ํ๊ณ ์ํ๊ณผ ๊ฐ์ ํฌ๊ธฐ๋ก ์ถ์ ---โค
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,255),2)
face = frame[y:y+h, x:x+w]
face = cv2.resize(face, (200, 200))
face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
# LBP ์ผ๊ตด ์ธ์๊ธฐ๋ก ์์ธก ---โฅ
label, confidence = model.predict(face)
if confidence < 400:
# ์ ํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ํผ์ผํธ๋ก ๋ณํ ---โฆ
accuracy = int( 100 * (1 -confidence/400))
if accuracy >= min_accuracy:
msg = '%s(%.0f%%)'%(names[label], accuracy)
else:
msg = 'Unknown'
# ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ ํ๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ ---โง
txt, base = cv2.getTextSize(msg, cv2.FONT_HERSHEY_PLAIN, 1, 3)
cv2.rectangle(frame, (x,y-base-txt[1]), (x+txt[0], y+txt[1]), \
(0,255,255), -1)
cv2.putText(frame, msg, (x, y), cv2.FONT_HERSHEY_PLAIN, 1, \
(200,200,200), 2,cv2.LINE_AA)
cv2.imshow('Face Recognition', frame)
if cv2.waitKey(1) == 27: #esc
break
cap.release()
cv2.destroyAllWindows()