项目代码
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()