人脸识别项目代码
項目代碼
1.拍照程序
import cv2 #攝像頭 cap = cv2.VideoCapture(0) falg = 1 num = 1 #拍照程序,按下鍵盤的s進行照片保存,圖片默認保存名稱是id.huang.jpg # 檢測是否在開啟狀態 while(cap.isOpened()):# 得到每幀圖像ret_flag, Vshow = cap.read()cv2.imshow("Capture_Test", Vshow)# 顯示圖像k = cv2.waitKey(1) & 0xFF# 按鍵判斷if k == ord('s'):# 鍵盤按下s鍵即保存#里面的huang代表姓名,可自行修改cv2.imwrite(str(num)+".huang"+".jpg", Vshow)print("success to save"+str(num)+".jpg")print("-------------------")num += 1elif k == ord(' '):#退出break # 釋放攝像頭 cap.release() # 釋放內存 cv2.destroyAllWindows()2.錄制視頻程序
# -*-coding:utf-8-*- import datetime import time import cv2 import oscam = cv2.VideoCapture(0) time_now = time.time() os.makedirs('capture', exist_ok=True) fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') video_out = None #錄制視頻程序:每10秒自動錄制一個10秒左右的視頻,視頻格式.mp4,mp4的文件名稱格式為時間搓.mp4 while True:ret, frame = cam.read()if video_out:video_out.write(frame)cv2.imshow("Video", frame)cv2.waitKey(1)if video_out is None or time.time() - time_now > 10:if video_out:print("save", video_path)video_out.release()video_out = Nonetime_str = datetime.datetime.now().strftime('%Y%m%d%H%M%S')video_path = time_str + '.mp4'video_out = cv2.VideoWriter(video_path, fourcc, 30.0, (640, 480))time_now = time.time()3.人臉數據錄入程序
import os import cv2 import sys from PIL import Image import numpy as np #函數功能:通過LBPHF識別器把面部和身份信息綁定 def getImageAndLabels(path):#保存人臉特征數據的數組facesSamples=[]#存儲人的基本信息,id和nameids=[]#儲存圖片信息imagePaths=[os.path.join(path,f) for f in os.listdir(path)]#加載分類器檢測人臉face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')#打印數組imagePathsprint('數據排列:',imagePaths)#將保存的全部圖片一一進行遍歷將身份信息一一保存起來for imagePath in imagePaths:#打開圖片,PIL的L打開方式指明圖片是灰度圖像,每一個像素點從0到255的信息保存在PIL_imgPIL_img=Image.open(imagePath).convert('L')#將轉換為灰度數的圖片向量化,轉成能讓計算機讀懂,將每一個像素點變成一個數值,保存在 img_numpyimg_numpy=np.array(PIL_img, 'uint8')#通過face_detector人臉檢測分類器獲取圖片人臉特征到數組face里面faces = face_detector.detectMultiScale(img_numpy)#通過圖片的文件名獲取身份信息,包括id和nameid = int(os.path.split(imagePath)[1].split('.')[0])#將id,name和for x,y,w,h in faces:ids.append(id)facesSamples.append(img_numpy[y:y+h,x:x+w])#打印臉部特征和idprint('fs:', facesSamples)print('id:', id) # print('fs:', facesSamples[id])print('fs:', facesSamples)print('臉部例子:',facesSamples[0])print('身份信息:',ids[0])return facesSamples,ids#人的面部信息保存在data/jm文件下的圖片,身份信息是文件名稱 #程序3功能:將人的面部信息和人的身份信息進行一一綁定,生成trainer/trainer.yml文件 if __name__ == '__main__':path='./data/jm/'#獲取圖像數組和id標簽數組和姓名faces,ids=getImageAndLabels(path)#通過加載LBPHF識別器把面部和身份信息通過訓練整合在一起recognizer=cv2.face.LBPHFaceRecognizer_create()recognizer.train(faces, np.array(ids))#將最后整合的信息保存到一個yml文件里recognizer.write('trainer/trainer.yml')4.測試程序 import cv2 import os #加載訓練數據集文件 recogizer=cv2.face.LBPHFaceRecognizer_create() recogizer.read('trainer/trainer.yml') #保存身份信息的名字 names=[] warningtime = 0#準備識別的圖片 def face_detect_demo(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#將導入的圖片灰度化face_detector=cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')#畫個框face=face_detector.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300))for x,y,w,h in face:cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)# 人臉識別評分,如果分比較高說明不可信,warningtime變量+1#當warningtime變量加到一定程度人認為不是我們所錄入的人員ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])if confidence > 80:global warningtimewarningtime += 1if warningtime > 100:warningtime = 0#不是錄入人員在輸出視頻中顯示unKonwcv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)else:#檢測到為錄入人員,在視頻中顯示錄入人員的姓名cv2.putText(img,str(names[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)cv2.imshow('result',img)def name():path = './data/jm/'imagePaths=[os.path.join(path,f) for f in os.listdir(path)]for imagePath in imagePaths:name = str(os.path.split(imagePath)[1].split('.',2)[1])names.append(name)#讀入根目錄下的1.mp4文件進行人臉錄入 cap=cv2.VideoCapture('1.mp4') name() while True:flag,frame=cap.read()if not flag:breakface_detect_demo(frame)if ord(' ') == cv2.waitKey(10):break cv2.destroyAllWindows() cap.release()總結
 
                            
                        - 上一篇: 小松鼠吃瓜子,一口可以吃一个,两个,三个
- 下一篇: 64行代码实现简单人脸识别
