OpenCV人脸监测与识别系统开发
人脸识别技术是基于人的脸部特征,对输入的人脸图像或者视频流,首先判断其是否存在人脸,如果存在人脸,则进一步的给出每个脸的位置、大小和各个主要面部器官的位置信息。并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。
1.人脸识别步骤
梳理一下人脸识别实现的步骤,主要由人脸采集,预处理,特征提取,匹配与识别四个步骤组成
2 人脸监测
人脸识别首先应该先实现人脸监测,要先在一张图片中捕获到人脸,再去识别图片中的人脸和数据库中人脸数据进行比较。
人脸检测的最常见方法是使用”Haar 分类器”。基于 Haar 功能的级联分类器的对象检测是 Paul Viola 和 Michael Jones 提出的一种有效的对象检测、基于机器学习的方法。
进行人脸检测需要大量的图像数据来训练分类器,然后从中提取特征,使用OpenCV可以进行人脸的训练和推理,也可以训练自己的分类器为任何对象进行分类,同时OpenCV包含许多预先训练过的分类器,我们只需要调用OpenCV的接口就可以。
代码如下:
#导入cv模块import cv2 as cv#检测函数def face_detect():gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')face = face_detect.detectMultiScale(gary)for x,y,w,h in face:cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv.imshow('result',img)#读取图像img = cv.imread('face2.jpg')#检测函数face_detect()#等待while True:if ord('q') == cv.waitKey(0):break#释放内存cv.destroyAllWindows()
在代码中,首先对读取的图像进行了灰度处理,然后引入级联分类器文件,通过detectMultiScale()函数来调用分类器功能,通过rectangle()函数来标记图像中的面孔,如果发现人脸,它会返回检测到的面部位置,作为左上角(x,y)的矩形,并将”w”作为宽度,将”h”作为高度 。
运行效果如下:
3.录入人脸功能模块
导入第三方库:
import cv2import osfrom PIL import Imageimport numpy as np
OS:主要是对文件和文件夹进行操作,在Python中对⽂件和⽂件夹的操作要借助os模块⾥⾯的相关功能。
PIL:python中最常用的图形处理库,PIL支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、裁剪、叠加以及图像添加线条、图像和文字等操作。
NumPy:一个由多维数组对象和用于处理数组的例程集合组成的库。可以执行以下操作:数组的算数和逻辑运算。傅立叶变换和用于图形操作的例程。与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。
存储人脸数据:
facesSamples=[]
存储姓名数据:
ids=[]
存储图片信息:
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
加载分类器:
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml'
遍历列表中的图片:
for imagePath in imagePaths:
将打开的图片灰度化:
PIL_img = Image.open(imagePath).convert('L')
将图片转化为数组:
img_numpy = np.array(PIL_img,'uint8')
获取图片人脸特征:
faces = face_detector.detectMultiScale(img_numpy)
获取每一张拍摄图片的id与姓名:
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])
打印面部特征与id,并返回数据:
print('id',id)print('fs:',facesSamples)return facesSamples,ids
调用图片路径:
path='./data/jm/'
获取图像数组和id标签数组和姓名:
faces,ids=getImageAndLabels(path)
加载识别器:
recognizer = cv2.face.LBPHFaceRecognizer_create()
训练数据:
recognizer.train(faces,np.array(ids))
保存面部特征到文件夹:
recognizer.write('tupian/tupian.yml')
完整代码如下:
import osimport cv2from PIL import Imageimport numpy as npdef getImageAndLabels(path):facesSamples=[]ids=[]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_img=Image.open(imagePath).convert('L')#将图像转换为数组,以黑白深浅# PIL_img = cv2.resize(PIL_img, dsize=(400, 400))img_numpy=np.array(PIL_img,'uint8')#获取图片人脸特征faces = face_detector.detectMultiScale(img_numpy)#获取每张图片的id和姓名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])print('id:', id)print('fs:', facesSamples)return facesSamples,idsif __name__ == '__main__':#图片路径path='./data/jm/'#获取图像数组和id标签数组和姓名faces,ids=getImageAndLabels(path)#获取训练对象recognizer=cv2.face.LBPHFaceRecognizer_create()#recognizer.train(faces,names)#np.array(ids)recognizer.train(faces,np.array(ids))#保存文件recognizer.write('trainer/trainer.yml')#save_to_file('names.txt',names)
4.人脸识别
人脸识别器已经完成,现在要在相机上捕获人脸。如果此人之前拍摄并训练过他的脸,识别器将做出预测,返回ID名。
使用刚刚训练的识别器模型(加载trainer.yml),然后就和刚刚“人脸分类器”的步骤一样去进行人脸识别,并且recognizer.predict将返回每张图片识别后的匹配率。
人脸识别实现函数如下:
def face_detect(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度face_detector=cv2.CascadeClassifier(r'haarcascade_frontalface_alt2.xml')face=face_detector.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300))#face=face_detector.detectMultiScale(gray)for x,y,w,h in face:cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)# 人脸识别ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])#print('标签id:',ids,'置信评分:', confidence)if confidence > 80: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 = './tupian/'# names = []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)
加载监控或已保存下来的视频:
#加载视频cap=cv2.VideoCapture(8)name()while True:flag,frame=cap.read()if not flag:breakface_detect_demo(frame)if ord(' ') == cv2.waitKey(10):break#释放内存+视频cv2.destroyAllWindows()cap.release()
最终效果如下
5.遇到的问题
1.旭日x3派并没有opencv-contrib-python库,需要通过
pip install opencv-contrib-python
进行安装
2.用OPENCV出现这样的错误:
cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
这个错误可能是因为图片路径形式书写错误,图片的格式不对,图片的数量不一致,路径中存在中文导致。
- 分享
- 举报
暂无数据-
浏览量:2843次2024-02-26 14:47:49
-
浏览量:992次2023-08-31 10:03:53
-
浏览量:1802次2024-03-14 17:53:46
-
浏览量:2832次2020-08-19 16:46:46
-
浏览量:2356次2020-08-19 16:45:18
-
浏览量:2514次2020-08-19 16:49:12
-
浏览量:2320次2020-08-20 18:01:22
-
浏览量:2772次2020-08-20 18:03:14
-
浏览量:2451次2020-08-17 18:04:26
-
浏览量:2498次2020-08-17 18:06:38
-
浏览量:3661次2020-08-17 18:05:11
-
浏览量:1163次2023-08-04 13:41:07
-
浏览量:2803次2020-08-19 16:47:34
-
浏览量:2287次2020-08-17 18:03:03
-
浏览量:4256次2020-08-19 16:34:45
-
浏览量:2364次2020-08-20 18:00:36
-
浏览量:1838次2020-08-19 16:35:48
-
浏览量:2281次2022-12-16 09:12:30
-
浏览量:2660次2020-08-20 17:57:05
-
11篇
- 有需要海思,SONY芯片(SONY,海思,镁光,OV,PIXELPLUS )芯片可以找我
- 使用Opencv+SVM+Hog进行行人识别的代码
- 分享海思Hi3519V101开发板、SoC产品简介、用户指南和SDK开发包
- opencv交叉编译静态库,支持ffmpeg、libjpeg,实现取流及写入jpeg文件
- [python opencv 计算机视觉零基础到实战] 十九、简易绘画板制作
- 图像平滑 —— opencv 学习记录(八)
- 分享海思3519V101 3519 3516AV200 3516CV300 开发板和SDK资料
- 计算机视觉图像处理-OpenCV入门基础学习
- [python opencv 计算机视觉零基础到实战] 十六、用opencv画画
- 【具身智能-应用】AI助力实现数字资产与物理数据对齐——电力工井“线-孔”识别
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
felix
微信支付举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明

微信扫码分享
QQ好友