本代碼使用了face_recognition三方庫,它是需要numpy、dlib、cmake作支撐的。主要是用鍵值對存放圖片和它對應的名字,最後打開攝像頭,比對原有存放的人臉,用pyttsx3語音庫來報出識別對象的名字。
下一步準備改用數據庫存放姓名和照片,實現完畢後再與django對接實現web端的人臉識別。
以下是現在完成的代碼,“下一步”還沒有實現:
import cv2
import pyttsx3
import face_recognition
import numpy as np
#創建人臉檢測級聯分類器對象實例
face_cascade = cv2.CascadeClassifier("C:\\Users\\TIM\\Anaconda3\\Library\\etc\\haarcascades\\haarcascade_frontalface_default.xml")
#創建人眼檢測級聯分類器實例
#eye_cascade = cv2.CascadeClassifier("E:\\pycharm\\untitled3.6\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml")
image = face_recognition.load_image_file(r'C:\Users\TIM\testface\c.jpg')
image2 = face_recognition.load_image_file(r'C:\Users\TIM\testface\b.jpg')
image3 = face_recognition.load_image_file(r'C:\Users\TIM\testface\a.jpg')
face_encoding = face_recognition.face_encodings(image)[0]
face_encoding2 = face_recognition.face_encodings(image2)[0]
face_encoding3 = face_recognition.face_encodings(image3)[0]
known_face_encodings = {
'王英傑': face_encoding3,
'費霞雲': face_encoding2,
'田越': face_encoding,
}
# known_face_encodings = [face_encoding]
camera = cv2.VideoCapture(0)
while True:
#參數ret 爲True 或者False,代表有沒有讀取到圖片
#第二個參數frame表示截取到一幀的圖片
ret, frame = camera.read()
# frame = cv2.imread(r'C:\Users\TIM\c.jpg')
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
face = face_cascade.detectMultiScale(gray, 1.5, 3)
for (x, y, w, h) in face:
# 繪製矩形框,顏色值的順序爲BGR,即矩形的顏色爲藍色
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = frame[y:y + h, x:x + w]
# 在檢測到的人臉區域內檢測眼睛
#eyes = eye_cascade.detectMultiScale(roi_gray)
#for (ex, ey, ew, eh) in eyes:
#cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
cv2.imshow('wang', frame)
k = cv2.waitKey(1)
if k == ord('s'):
rgb_frame = frame[:, :, ::-1]
# 獲取畫面中的所有人臉位置及人臉特徵碼
face_locations = face_recognition.face_locations(rgb_frame)
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
# 對獲取的每個人臉進行識別比對
for (top, right, bottom, left), face_encoding in list(zip(face_locations, face_encodings)):
print(face_encoding)
# 對其中一個人臉的比對結果(可能比對中人臉庫中多個人臉)
for face in known_face_encodings:
print([np.array(known_face_encodings[face])])
matches = face_recognition.compare_faces([np.array(known_face_encodings[face])], face_encoding, tolerance=0.47)
# 默認只認爲是比對中的第一個人臉.
print(matches)
if True in matches:
first_match_index = matches.index(True)
engine = pyttsx3.init()
engine.say('你好,{}'.format(face))
engine.runAndWait()
else:
engine = pyttsx3.init()
engine.say('你是誰,你不是{}'.format(face))
engine.runAndWait()
if k == ord('q'):
break
camera.release()