Opencv之人脸识别

OpenCV的简介

OpenCV是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令。

1、应用场景
人机互动、物体识别、图像分割、人脸识别、动作识别、运动跟踪、机器人等。

人脸识别

1、人脸识别简介
人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像头或摄像机采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部的一系列相关技术,通常也叫做人像识别,面部识别。

2、人脸识别系统基本组成
在这里插入图片描述

人脸识别流程

在这里插入图片描述

主要代码注释

环境配置

(人脸分类器用的是haarcascade_frontalface_default.xml)

opencv 的安装
pip install opencv-python
pillow的安装,注:pillow为图像处理包。
pip install pillow
contrib的安装,用于训练自己的人脸模型的一个OpenCV扩展包
pip instal opencv-contrib-python
pyttsx3 文字转语音库使用
pip install pyttsx3

如果你下载软件库缓慢可以在后面加上下列路径,可以加快下载速度。
pip install opencv-python (-i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com)

1、人脸采集函数

#导入模块
import cv2 as cv
#打开摄像头
cap = cv.VideoCapture(0)
#采集的照片的数目
num = 1
#录入人员的姓名
face_id = input(‘录入人员姓名:\n’)
#录入人员的标签,每个人的标签不能相同
face_idnum = input(‘录入人员编号:\n’)
print(‘\n 正在打开摄像头。。。。。。。’)
while (cap.isOpened()):
#捕获摄像头图像
ret_flag,vshow = cap.read()
#显示捕获的照片
cv.imshow(“capture_test”,vshow)
#图像刷新的频率,图像才能正常显示出来,返回1ms内按键按下的ASII码。
k = cv.waitKey(1)&0xff
#设置按键保存照片
if k == ord(‘s’):
#保存图片(保存路径以及文件命名方式)
cv.imencode(“.jpg”,vshow)[1].tofile(“imgdata/”+str(face_idnum)+“.”+str(face_id)+‘.’+str(num)+“.jpg”)
print(“成功保存第”+str(num)+‘张照片’+“.jpg”)
print(“***********************”)
num += 1
elif k == ord(’ '):
break
#关闭摄像
cap.release()
#释放图像显示窗
cv.destroyAllWindows()

2、人脸训练函数

import os
import cv2 as cv
from PIL import Image
import numpy as np

def getImageAndlabels(path):
#人脸数据数据
facesSamples = []
#人标签
ids = []
#读取所有的照片的名称(os.listdir读取根目录下文件的名称返回一个列表,os.path.join将根目录和文件名称组合形成完整的文件路径)
imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
#调用人脸分类器(注意自己文件保存的路径,英文名)
face_detect = cv.CascadeClassifier(‘D:/python 3.10.1/OpenCV/haarcascade_frontalface_default.xml’)
#循环读取照片人脸数据
for imagePath in imagePaths:
#用灰度的方式打开照片
PIL_img = Image.open(imagePath).convert(‘L’)
#将照片转换为计算机能识别的数组OpenCV(BGR–0-255)
img_numpy = np.array(PIL_img,‘uint8’)
#提取图像中人脸的特征值
faces = face_detect.detectMultiScale(img_numpy)
#将文件名按“.”进行分割
id = int(os.path.split(imagePath)[1].split(‘.’)[0])
#防止无人脸图像
for x,y,w,h in faces:
ids.append(id)
facesSamples.append(img_numpy[y:y+h,x:x+w])
return facesSamples,ids

if name == ‘main’:
#人脸图片存放的文件夹
path = ‘imgdata’
faces, ids = getImageAndlabels(path)
#调用LBPH算法对人脸数据进行处理
recognizer = cv.face.LBPHFaceRecognizer_create()
#训练数据
recognizer.train(faces, np.array(ids))
#将训练的系统保存在特定文件夹
recognizer.write(‘trainer/trainer.yml’)

3、人脸识别函数(注取消语音播报识别会流畅多)

import os
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import pyttsx3
engine = pyttsx3.init()
#加载训练数据集文件
recogizer=cv2.face.LBPHFaceRecognizer_create()
#读取训练好的系统文件
recogizer.read(‘trainer/trainer.yml’)
#存储人脸库中人员的名字
names=[]
#对应的标签
idn = []
#准备识别的图片
def face_detect_demo(img):
#转换为灰度
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#调用下载好的人脸分类器
face_detector = cv2.CascadeClassifier(‘D:/python 3.10.1/OpenCV/haarcascade_frontalface_default.xml’)
#读取图像中人脸的特征值(返回值为人脸的相关坐标和长宽)
face=face_detector.detectMultiScale(gray,1.1,5,0,(100,100),(800,800))
for x,y,w,h in face:
#把人脸框起来
cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
# 人脸识别
ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
if confidence > 60:
img = cv2AddChineseText(img, “外来人员”+str(int(confidence)), (x+10, y+10), (0, 255, 0), 30)
engine.say(‘陌生人员靠近!’)
engine.runAndWait()
#putText(img, ‘unkonw’, (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
else:
img = cv2AddChineseText(img, str(names[idn.index(ids)])+str(int(confidence)), (x+10, y-25), (0, 255, 0), 30)
#putText(img,str(names[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
engine.say(str(names[idn.index(ids)]) + ‘同学,你好!’)
engine.runAndWait()
cv2.imshow(‘result’,img)
def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):
if (isinstance(img, np.ndarray)): # 判断是否OpenCV图片类型
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB
))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(img)
# 字体的格式
fontStyle = ImageFont.truetype(
“simsun.ttc”, textSize, encoding=“utf-8”)
# 绘制文本
draw.text(position, text, textColor, font=fontStyle)
# 转换回OpenCV格式
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
def name():
path = ‘./imgdata/’
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
for imagePath in imagePaths:
name = str(os.path.split(imagePath)[1].split(‘.’,3)[1])
id = int(os.path.split(imagePath)[1].split(‘.’,3)[0])
names.append(name)
idn.append(id)
cap=cv2.VideoCapture(0)
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()
五、功能实现
1、可以录入多人人脸,并且有效识别。

2、可以同时识别多人。

3、人脸库中人员的照片也是识别外来人员。

六、演示视频
可以把完整的人脸录入-数据训练-人脸识别流程演示,加上多人识别进行对比,本人与本人照片对比识别。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值