0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV人脸监测与识别步骤

新机器视觉 来源:古月居 2023-05-15 09:18 次阅读

人脸识别技术是基于人的脸部特征,对输入的人脸图像或者视频流,首先判断其是否存在人脸,如果存在人脸,则进一步的给出每个脸的位置、大小和各个主要面部器官的位置信息

并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。

1. 人脸识别步骤

梳理一下人脸识别实现的步骤,主要由人脸采集,预处理,特征提取,匹配与识别四个步骤组成

bedca496-f2b5-11ed-90ce-dac502259ad0.png

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”作为高度 。

运行效果如下:

bef22e6a-f2b5-11ed-90ce-dac502259ad0.png

3. 录入人脸功能模块

导入第三方库:

import cv2
import os
from PIL import Image
import 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 os
import cv2
from PIL import Image
import numpy as np


def getImageAndLabels(path):
  facesSamples=[]
  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_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,ids


if __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:
    break
  face_detect_demo(frame)
  if ord(' ') == cv2.waitKey(10):
    break
#释放内存+视频
cv2.destroyAllWindows()
cap.release()

最终效果如下

bf1c8b1a-f2b5-11ed-90ce-dac502259ad0.png

bf3ec0b8-f2b5-11ed-90ce-dac502259ad0.jpg

5. 遇到的问题

旭日x3派并没有opencv-contrib-python库,需要通过

pip install opencv-contrib-python

进行安装

用OPENCV出现这样的错误:

cpp error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

这个错误可能是因为图片路径形式书写错误,图片的格式不对,图片的数量不一致,路径中存在中文导致




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人脸识别技术

    关注

    0

    文章

    120

    浏览量

    14385
  • 傅立叶变换
    +关注

    关注

    3

    文章

    98

    浏览量

    32106
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40775
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83466
  • PIL
    PIL
    +关注

    关注

    0

    文章

    18

    浏览量

    8507

原文标题:OpenCV人脸识别系统开发(一):OpenCV人脸监测与识别

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    树莓派上使用OpenCV和Python实现实时人脸检测

    本文介绍了如何在树莓派上,使用 OpenCV 和 Python 完成人脸检测项目。该项目不仅描述了识别人脸所需要的具体步骤,同时还提供了很多扩展知识。此外,该项目并不需要读者了解详细的
    的头像 发表于 03-06 09:00 5.1w次阅读

    基于openCV人脸检测系统的设计

    通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库openCV进行人脸检测系统的设计,实现了对出现在视频或图像中的人脸检测。此外,在VC++6.0环境下实现了对一
    发表于 12-23 14:19

    【NanoPi2申请】基于opencv人脸识别门禁系统

    防与监控的系统,望批准!谢谢!项目描述:项目简述:本项目旨在一个较高性能的嵌入式平台上搭建一个linux系统,利用opencv编程实现人脸识别。为了实现图像采集,需要编写linux驱动对摄像头的数据
    发表于 12-18 14:34

    【LeMaker Guitar申请】基于LeMaker Guitar的人脸识别系统

    学习对嵌入式应用层开发有一个更深入的认识。项目描述:基于LeMaker Guitar的人脸识别系统设计思路是把 OpenCV移植到嵌入式操作系统中,然后将人脸
    发表于 01-18 16:23

    【LeMaker Guitar试用体验】之基于Python下的人脸识别系统【结贴】

    本帖最后由 windworld 于 2017-1-22 11:26 编辑 OpenCV 作为开源的计算机视觉软件包,在人脸识别方便也具有很广泛的应用,在这里我们采用opencv
    发表于 02-25 14:03

    LabVIE人脸识别

    labview编写的工业级视觉软件,自带人脸识别功能,只有验证过的技术人员才有权限修改参数,是不是显得软件的安全性能很高?他山之石可以攻玉,结合opencv你就可以实现!废话不多说直接上图:以上是检测效果
    发表于 05-12 17:29

    【Raspberry Pi 3试用体验】+Opencv+python的人脸识别

    ;)看一下效果:光线不好还是能认出来,说明opencv自带的分类器算开源里面不错的了~参考:Tigerboard开发板试用体验 python+opencv人脸识别 NanoPi2试用
    发表于 05-13 21:38

    【AI技能解析】人脸识别是怎么做到的?

    识别支付场景】人脸识别这么火,那么它到底是怎么实现的呢?看大牛为您解锁人脸识别技术中的黑科技!中的图片
    发表于 03-16 11:25

    基于QT+OpenCV人脸识别-米尔iMX8M Plus开发板的项目应用

    本篇测评由电子工程世界的优秀测评者“流行科技”提供。此次测试的开源项目,是基于QT+OpenCV人脸识别打卡项目。本次体验使用的是开源的代码,此代码本来是运行在WIN下的,为了测试稍微进行了修改
    发表于 05-17 17:43

    如何在OpenHarmony上使用SeetaFace2人脸识别库?

    OpenHarmony上实现过人脸识别功能,跟着本文带你快速在OpenHarmony标准设备上基于SeetaFace2和OpenCV实现人脸识别
    发表于 08-22 17:46

    【飞凌RK3568开发板试用体验】使用OpenCV进行人脸识别

    RK3568四核Arm Cortex-A55 处理器的主板,从厂商的宣传看,其主要市场就是人脸识别等视频和图像应用。今天就使用OpenCV自带的DNN模块进行人脸
    发表于 01-11 22:06

    人脸识别

    OpenCV3编程入门》书本配套源代码:人脸识别
    发表于 06-06 15:39 13次下载

    OpenCV3编程入门-源码例程全集-人脸识别

    OpenCV3编程入门-源码例程全集-人脸识别
    发表于 09-17 22:55 1次下载

    基于SeetaFace2和OpenCV实现人脸识别

    相信大部分同学们都已了解或接触过OpenAtom OpenHarmony(以下简称“OpenHarmony”)了,但你一定没在OpenHarmony上实现过人脸识别功能,跟着本文带你快速在OpenHarmony标准设备上基于SeetaFace2和
    的头像 发表于 08-17 10:50 1766次阅读

    使用DFRobot LattePanda进行OpenCV人脸识别

    电子发烧友网站提供《使用DFRobot LattePanda进行OpenCV人脸识别.zip》资料免费下载
    发表于 10-28 10:14 1次下载
    使用DFRobot LattePanda进行<b class='flag-5'>OpenCV</b><b class='flag-5'>人脸</b><b class='flag-5'>识别</b>