目录

前言

第一章 OpenCV介绍

第二章 功能描述

2.1 对已有的数据进行检测

2.2 陌生人检测并发出警告

2.3 保存陌生人的视频

2.4 输入图片进行检测

2.5 现场录用信息

第三章 功能实现

3.1 截取人脸图片

3.2 对图片进行处理

3.3 进行训练

3.4 进行预测

3.5 实时预测

第四章 出现的问题

源码


前言

学习了图像识别,都没有具体的做出一个项目。现在的人脸识别很火,于是就做了一个基于opencv的人脸识别

第一章 OpenCV介绍

OpenCV基本函数使用--Python_牧子川的博客-CSDN博客

第二章 功能描述

以下的功能都实现了,但是有些功能会在源码进行解释

2.1 对已有的数据进行检测

当训练器已经包含了本人的面部信息时,在进行识别时能准确的识别出来,并显示出来

2.2 陌生人检测并发出警告

当有陌生人靠近并停留了10s钟以上时,就会发出警报

2.3 保存陌生人的视频

当有陌生人靠经并停留10秒中以上时,将该陌生人的信息进行保存未视频

2.4 输入图片进行检测

可以对输入的人脸的图片进行检测

2.5 现场录用信息

可以以及录用人脸信息,并保存当前的人脸信息

第三章 功能实现

3.1 截取人脸图片

第一步 打开摄像头

import cv2cap = cv2.VideoCapture(0)
while cap.isOpened():_, frame = cap.read()cv2.imshow("img", frame)key = cv2.waitKey(1)if key == ord('q'):breakcap.release()
cv2.destroyAllWindows()
cap.release()与cv2.destroyAllWindows()只能放在while循环体外。

第二步 截取图片

使用的是人脸分类器

classfier = cv2.CascadeClassifier(r'G:\Opencv 4.5.3\opencv\build\etc\lbpcascades\lbpcascade_frontalface_improved.xml')

detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示),是一个一维数组[x, y, w, h]分别代表着上左,上右,下左,下右的坐标

faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=20, flags=4)

detectMultiScale函数参数介绍

1、grey:是输入图像

2、scaleFactor:这个是每次缩小图像的比例,默认是1.1 ,我这里选用1.2

3、minNeighbors=15:它表明如果有15个框都重叠一起了,那这里肯定是脸部,当minNeighbors越大时,能适当提高精度

4、minSize():匹配物体的最小范围 maxSize():匹配物体的最大范围

5、 flags = 0:可以取如下这些值:

CASCADE_DO_CANNY_PRUNING = 1, 利用canny边缘检测来排除一些边缘很少或者很多的图像区域

CASCADE_SCALE_IMAGE = 2, 正常比例检测

CASCADE_FIND_BIGGEST_OBJECT = 4, 只检测最大的物体

第三步 保存图片

cv2.imwrite(img_name, image)
cv2.rectangle(frame, (x - 20, y - 20), (x + w + 20, y + h + 20), rect_color, 2)
# 显示当前捕捉到了多少人脸图片了
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, 'num:%d' % num, (x + 30, y + 30), font, 1, (255, 0, 255), 4)
num += 1
if num > 200:  # 如果超过指定最大保存数量退出循环break

保存图像

cv2.imwrite(file,img,num)保存一个图像

file:保存的文件名

img:要保存的图像。

num:可选,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3.

3.2 对图片进行处理

对图片进行训练时,实际上训练的时图片的像素点,所以我们要得到图片的像素

第一步 得到像素点

# 使用LBP分类器,还有一种更精确但速度较慢的Haar分类器
face_cascade = cv2.CascadeClassifier(r'G:\Opencv 4.5.3\opencv\build\etc\lbpcascades\lbpcascade_frontalface.xml')  # todo
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
(x, y, w, h) = faces[0]
return gray[y:y + w, x:x + h], faces[0]

第二步 得到图片相对应的标签和像素

label = int(dir_name.replace("s", ""))
face, rect = detect_face(image)
# 忽略为检测到的人脸
if face is not None:faces.append(face)labels.append(label)
return faces, labels

3.3 进行训练

opencv中的face有专门的训练方式,对每个参考图像计算LBPH,得到一个向量。每个人脸都是整个向量集中的一个点。

cv2.face_FaceRecognizer.train(src,labels)

● src:训练图像,用来学习的人脸图像。
● labels:标签,人脸图像所对应的标签。

def train(face_recognizer):"""训练数据"""print("数据准备")faces, labels = prepare_training_data(r"./train_data")print("准备完成")print("Total faces: ", len(faces))print("Total labels: ", len(labels))print("开始训练")# 训练人脸识别器face_recognizer.train(faces, np.array(labels))# 保存训练好的模型face_recognizer.save(r"./models/train1.yml")print("训练完成")

3.4 进行预测

cv2.face_FaceRecognizer.predict()

使用我们的人脸识别器预测图像 predict()入口参数必须为单通道灰度图像
对当前人脸图像进行判断,从人脸库中寻找与当前图像距离最近的人脸图像,与某个人脸图像最近,就将当前图像标注为其对应的标签。如果待测图像与所有人脸图像的距离都大于函数cv2.face.LBPHFaceRecognizer_create()中参数threshold所指定的距离值,则认为没有找到对应的结果,即无法识别当前人脸。

返回的是一个元组,第一个是识别某一类,第二类是一个置信度,即有多少可能

# 加载训练好的模型
face_recognizer.read(r'./models/train1.yml')
addr = input("请输入图片地址:")
test_img = cv2.imread(addr)
# 复制图像,因为我们不想更改原始图像
test_img = test_img.copy()
face, rect = detect_face(test_img)
label = face_recognizer.predict(face)
label_text = subjects[label[0]]draw_rectangle(test_img, rect)
draw_text(test_img, label_text, rect[0], rect[1] - 5)cv2.imshow("predict", test_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.5 实时预测

就是在框出人脸图像的同时对这个图片进行预测,即把截取图片和预测同时进行

face_recognizer.read(r'./models/train.yml')
cap = cv2.VideoCapture(0)
# 循环检测识别人脸
while True:_, frame = cap.read()face, rect = detect_face(frame)try:label = face_recognizer.predict(face)except Exception as e:print("错误信息为:", e)traceback.print_exc()print('traceback.format_exc():\n%s'%traceback.format_exc())cv2.imshow('camera', frame)else:print(label)if label[1] > 80:draw_rectangle(frame, rect)draw_text(frame, subjects[0], rect[0], rect[1] - 5)else:label_text = subjects[label[0]]draw_rectangle(frame, rect)draw_text(frame, label_text, rect[0], rect[1] - 5)cv2.imshow('camera', frame)# 等待10毫秒看是否有按键输入k = cv2.waitKey(10)# 如果输入q则退出循环if k & 0xFF == ord('q'):break# 释放摄像头并销毁所有窗口
cap.release()
cv2.destroyAllWindows()

第四章 出现的问题

难点一:无法打开本机自带摄像头

解决方法:cap = cv2.VideoCapture(0)调用本机摄像头

难点二:在进行人脸识别时,只要人稍微一动,就会识别失败

解决方法:在读入图片时,可以先延时一小段时间在进行读入图片,这样在识别到第一帧图片时会等一会在去识别另一帧图片,只要时间间隔短,则不会出现这种情况

难点三:训练好模型后进行检测总是会出错,不能正确检测出本人

解决方法:这个原因为数据集不够,人脸的特征没有完全被学到;环境因素的影响会导致模型识别错误,可以通过增加人脸数据集的方式再次进行训练,增加噪声

源码

Face-recognition

基于OpenCV实现人脸识别--Python相关推荐

  1. Python基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

  2. 基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

  3. 树莓派 --- 基于OpenCV实现人脸识别

    目录 参考博客 调百度人脸识别的API也能达到目的,我这里是基于OpenCV进行人脸识别 OpenCV(Open source Computer Vision Library) 是一个开源的计算机视觉 ...

  4. 【优秀毕设】基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发、可基于树莓派)

    [优秀毕设]基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发.可基于树莓派) 该系统利用Harr级联检测和LPBH进行人脸检测和训练.识别 利用Tkinter完成界面搭建 利用Fla ...

  5. 基于OpenCV的人脸识别系统的pyhon源代码

    本论文主要阐述了基于OpenCV的人脸识别原型系统.基于生物特征识别的身份认证方法有指纹.掌纹.眼睛虹膜.人脸等,其中,由于人脸的稳定性和可见性,人脸识别的研究与应用成为热点,本文针对出租公寓安全管理 ...

  6. 【人工智能毕设之基于opencv的人脸识别智能考勤管理系统

    [人工智能毕设之基于opencv的人脸识别智能考勤管理系统-哔哩哔哩] https://b23.tv/slzvS7e

  7. Python 毕业设计 - 基于 opencv 的人脸识别上课考勤系统,附源码

    一.简介 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的. 项目使用Python实现,基于OpenCV框架进行人脸识别和摄像头硬件调用,同时也用OpenCV工具包处理图片.交互界 ...

  8. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  9. 基于OpenCv的人脸识别,翻车了居然识别错误。

    前言 我们身边的人脸识别有车站检票,监控人脸,无人超市,支付宝人脸支付,上班打卡,人脸解锁手机. 人脸检测是人脸识别系统组成的关键部分之一,其目的是检测出任意给定图片中的包含的一个或多个人脸,是人脸识 ...

最新文章

  1. 让Python不在mac的dock上显示火箭图标
  2. 【sparkStreaming】将DStream保存在MySQL
  3. linux ls什么意思,linux – 你如何确定bash ls的颜色是什么意思?
  4. 计算机专业的金书,《计算机专业英语》书评,金书网
  5. C#教程4:数据类型
  6. java基础提升篇:synchronized同步块和volatile同步变量
  7. 20175204 张湲祯 2018-2019-2《Java程序设计》第九周学习总结
  8. BIO-NIO-AIO
  9. WordPress架构简单剖析
  10. 接口的定义与实现(重要)
  11. 文件批量处理器Android,GFileBat 2012(文件批量处理器)V1.1 正式版
  12. 浅析Thinkphp3.0的行为扩展模式
  13. Security - 轻量级Java身份认证、访问控制安全框架
  14. java万能万年历的程序_Java万年历
  15. 如何将本地图片转成链接?
  16. 2018年的好书基本都在这了,你一共读过几本?
  17. 洛谷 P2873 [USACO07DEC]泥水坑Mud Puddles
  18. VIVADO中WNS,WHS,TNS,THS含义
  19. 利用kali暴力破解获取windows账号密码
  20. MATLAB | 那些你不得不知道的MATLAB小技巧(四)

热门文章

  1. 转:采用geodatabase做乡界的一点总结
  2. dtmf信号系统的matlab仿真,dtmf信号系统的matlab仿真毕业设计
  3. android设置屏幕高度和宽度设置,Android手机的屏幕宽高度和代码设置控件的宽高度...
  4. python 比较序列是否包含同样元素_Python学习之常见序列比较
  5. php操作xml类,PHP实现的XML操作类【XML Library】
  6. qchart画完以后删除_身为宫廷画师,郎世宁为何要偷偷画乾隆的侧身像?跟一次惩罚有关...
  7. centos7 安装jdk_Centos 7安装和配置 ElasticSearch入门小白
  8. python functools.reduce_Python之functools.reduce使用
  9. 适合传统节日促销首焦设计的PSD分层模板
  10. PSD分层模板素材丨只需掌握三大规则!电商海报秒脱俗套