基于openCV实现简单的人脸识别

前言

人脸辨认是一种根据人的脸部特征信息进行身份辨认的一种生物辨认技能。它利用摄像机或摄像头收集含有人脸的图画或视频流,并自动在图画中检测和跟踪人脸,进而对检测到的人脸进行分析和辨认。人脸辨认具有便利、快速、友爱、无侵入等长处,现已广泛应用于安全防备、金融支付、社交文娱、智能家居等范畴。

  本文将介绍怎么运用pythonopenCV(接下来简称 cv2 )来完结人脸辨认,包含怎么收集人脸图画、怎么运用摄像头进行人脸检测和辨认等,并经过代码示例展现具体的完结进程。

环境装备

本次试验中,主要是在 Jupyter 用 Python 根据 openCV 完结人脸辨认。

  这儿就不具体介绍怎么装置装备了,能够经过以下链接访问具体进程:

  • Jupyter Notebook 介绍、装置及运用教程
  • Python装置与环境装备
  • 运用pip或在anaconda装置 openCV

试验原理

  此次试验进程内容比较简略,先经过cv2调用摄像头,从视频中分离每一帧画面,再调用cv2预练习的模型face_cascade对画面进行人脸检测,检测到人脸后,在对应帧画面上制作赤色方框。

  除此之外,还加上了眼部检测,由于人脸现已检测到了,只需求将检测到的眼部独自提取出来,在调用eye_cascade进行眼部检测,同样在检测到的眼部周围制作绿色方框。

  完结检测和符号后,调用cv2进行显现,按键盘 Esc 退出。

基于openCV实现简单的人脸识别

程序设计

1. 收集人脸

  依照流程图,咱们将程序分为三个部分,首先是完结摄像头的收集,然后完结脸部和眼部的检测。在这儿摄像头的收集能够调用 cv2 中的VideoCapture,它既支撑从视频文件读取,也支撑直接从摄像机(如电脑自带摄像头)中读取。

# 调整参数完结读取视频或调用摄像头
cap = cv2.VideoCapture(0)  # 笔记本电脑摄像头用 0 表明即可,视频建议运用绝对地址。
# 读取摄像头中的帧
ret, frame = cap.read()

2. 人脸辨认

  在这儿能够独自写一个face_rec人脸辨认的函数,仅传入frame即可,由于在后面咱们会一直经过摄像头收集去检测窗口中的人脸,直至咱们按下 ESC 键退出。

  这是修改后的代码:

cap = cv2.VideoCapture(0)
while True:
    # 读取摄像头中的帧
    ret, frame = cap.read()
    # 调用人脸辨认函数
    face_rec(frame)
    c = cv2.waitKey(10)
    # 当键盘按下‘ESC’退出程序
    if c == 27: # ASCII 码值
        break

  那么接下来需求完结人脸辨认face_rec函数,这块咱们得需求先了解什么是灰度图,它能够减少图画的原始数据量使咱们后续的计算更少、更快,然后进步咱们的运算速度。

# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  为了便利学习,本文调用cv2预练习的模型face_cascade对画面进行人脸检测。

# 创建人脸辨认分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_cascade.load('haarcascade_frontalface_default.xml')
# 创建人眼辨认分类器
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
face_cascade.load('haarcascade_eye.xml')
# 检测人脸
faces = face_cascade.detectMultiScale(gray,
                                          scaleFactor  = 1.15,
                                          minNeighbors = 3,
                                          flags        = cv2.IMREAD_GRAYSCALE,
                                          minSize      = (40,40))

  想要了解代码中 haar 能够点击这儿,而 Haar 特征分类器便是一个 XML 文件,该文件中会描绘人体各个部位的 Haar 特征值。包含人脸、眼睛、嘴唇等等。

  cv2中人脸检测运用的是detectMultiScale函数; 它能够检测出图片中所有的人脸,并将人脸用 vector 保存各个人脸的坐标、巨细(用矩形表明); 函数由分类器对象调用,其中的参数包含:

  • image:表明的是要检测的输入图画
  • objects:表明检测到的人脸方针序列
  • scaleFactor:表明每次图画尺度减小的比例
  • minNeighbors:表明一个方针至少要被检测到多少次才算是真的方针
  • minSize:为方针的最小尺度
  • maxSize:为方针的最大尺度

3. 制作方框

  执行完上面代码后,现在只需求咱们将检测到的人脸脸部和眼部独自提取出来制作边框,仅调用cv2中的rectangle()即可,它能够帮助咱们制作一个简略的、粗的或填充鸿沟的矩形。

# 在人脸周围制作方框
for (x,y,w,h) in faces:
    img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
# 进行眼部检测
eyes = eye_cascade.detectMultiScale(gray,
                                        scaleFactor  = 1.1,
                                        minNeighbors = 3,
                                        flags = cv2.IMREAD_GRAYSCALE,
                                        minSize      = (3,3))
for (ex,ey,ew,eh) in eyes:
    # 制作眼部方框
    img = cv2.rectangle(frame,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)   
cv2.imshow('result',img)

4. 运转测验

  在代码最终输入以下代码:

# 封闭摄像头
cap.release()  # 中止捕获视频
cv2.destroyAllWindows() # 封闭相应的显现窗口

  测验成果截图:

基于openCV实现简单的人脸识别

至此,本次的试验完毕,一起感谢文中所提及知识点的作者!最终源代码放在我的GitHub。

或许会遇到的问题?

这是我在实践试验进程中呈现到的问题,希望能帮到您。

1. 装置环境网速慢…..

或许你需求加速你的网络环境或者运用国内镜像。

2. 运转报错:error: (-215) !:in function cv

应该是路径出了问题,需求运用绝对路径

参考文献

  • openCV 中文文档
  • VideoCapture.read()视频未读完好问题
  • detectMultiScale()函数解析
  • cv2.rectangle 参数意义