64行程式碼實現簡單人臉識別

專注的阿熊發表於2022-04-12

import os

import face_recognition

import cv2

# 讀取到資料庫中的人名和麵部特徵

face_databases_dir = 'face_databases'

user_names = []

user_faces_encodings = []

# 得到 face_databases 中所有檔案

files = os.listdir('face_databases')

# 迴圈讀取

for image_shot_name in files:

     # 擷取檔名作為使用者名稱 存入 user_names 列表中

     user_name, _ = os.path.splitext(image_shot_name)

     user_names.append(user_name)

     # 讀取圖片檔案中的面部特徵資訊存入 user_faces_encodings 列表中

     image_file_name = os.path.join(face_databases_dir, image_shot_name)

     # 載入圖片

     image_file = face_recognition.load_image_file(image_file_name)

     # 讀取圖片資訊

     face_encoding = face_recognition.face_encodings(image_file)[0]

     user_faces_encodings.append(face_encoding)

print(" 資料庫載入完畢! ")

# 開啟攝像頭,讀取攝像頭拍攝到的畫面

# 定位到畫面中人的臉部,並用綠色的框框把人臉框住

# 用拍攝到人的臉部特徵和資料庫中的面部特徵去匹配

# 並在使用者頭像的綠框上方用使用者的姓名做標識,未知使用者統一用 Unknown

# 1 、開啟攝像頭 獲取攝像頭物件

video_capture = 外匯跟單gendan5.comcv2.VideoCapture(0)

# 2 、迴圈不停的獲取攝像頭拍攝的畫面,並做進一步處理

while True:

     # 2.1 獲取攝像頭拍攝的畫面

     ret, frame = video_capture.read()

     # 2.2 從拍攝到的畫面中提取出人的臉部所在區域

     face_locations = face_recognition.face_locations(frame)

     # 2.2.1 從所有人的頭像所在區域提取出臉部特徵

     face_encodings = face_recognition.face_encodings(frame, face_locations)

     names = []

     # 2.2.2 匹配 遍歷 face_encodings 和資料庫中的去比對

     for face_encoding in face_encodings:

         matchers = face_recognition.compare_faces(user_faces_encodings, face_encoding)

         name = "Unknown"

         for index, is_match in enumerate(matchers):

             if is_match:

                 name = user_names[index]

                 break

         names.append(name)

     # 2.3 迴圈遍歷人到額臉部所在區域 並畫框 在框框上標識姓名

     for (top, right, bottom, left), name in zip(face_locations, names):

         # 2.3.1 畫框

         # BGR

         cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)

         font = cv2.FONT_HERSHEY_DUPLEX

         cv2.putText(frame, name, (left, top - 10), font, 0.5, (0, 255, 0), 1)

     # 2.4 透過 opencv 把畫面展示出來

     cv2.imshow("Video", frame)

     # 2.5 q 迴圈退出 ( 關閉攝像頭 )

     if cv2.waitKey(1) & 0xFF == ord('q'):

         break

# 3 、釋放攝像頭資源

video_capture.release()

cv2.destroyAllWindows()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2886751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章