项目代码

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 += 1
    elif k == ord(' '):#退出
        break
# 释放摄像头
cap.release()
# 释放内存
cv2.destroyAllWindows()


2.录制视频程序


# -*-coding:utf-8-*-
import datetime
import time
import cv2
import os

cam = 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 = None
        time_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和name
    ids=[]
    #储存图片信息
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    #加载分类器检测人脸
    face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
    #打印数组imagePaths
    print('数据排列:',imagePaths)
    #将保存的全部图片一一进行遍历将身份信息一一保存起来
    for imagePath in imagePaths:
        #打开图片,PIL的L打开方式指明图片是灰度图像,每一个像素点从0到255的信息保存在PIL_img
        PIL_img=Image.open(imagePath).convert('L')
        #将转换为灰度数的图片向量化,转成能让计算机读懂,将每一个像素点变成一个数值,保存在 img_numpy
        img_numpy=np.array(PIL_img, 'uint8')
        #通过face_detector人脸检测分类器获取图片人脸特征到数组face里面
        faces = face_detector.detectMultiScale(img_numpy)
        #通过图片的文件名获取身份信息,包括id和name
        id = 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])
        #打印脸部特征和id
        print('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 warningtime
            warningtime += 1
            if warningtime > 100:
               warningtime = 0
                #不是录入人员在输出视频中显示unKonw
            cv2.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:
        break
    face_detect_demo(frame)
    if ord(' ') == cv2.waitKey(10):
        break
cv2.destroyAllWindows()
cap.release()