热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

人脸检测pyqt+opencv+dlib

一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头,

一、实验目标

绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头,用方框框出人脸实现人脸的检测,绘制出人脸的特征点(包括眼睛,鼻子和嘴巴),最后将检测结果截图保存。

二、环境搭建

Pycharm+Anaconda3+ PyQt5+Opencv+Dlib

三、实验成果

本项目在完成最初设计目标的同时,还扩展增加了一些其他的功能。可实现的功能如下所示。

1.打开、关闭摄像头
2.调用摄像头进行人脸检测和特征点绘制
3.保存人脸检测截图
4.录制、保存视频
5.加载本地视频进行检测
6.加载本地图片进行检测
7.抓拍人脸
8.实时显示程序的运行状态
9.安全退出
在这里插入图片描述

四、实验方法

4.1 图形界面

PYQT是一个创建GUI应用程序的工具包,它是QT库的Python版本。使用PyQt5工具可以快速地实现简单的界面开发,包括界面设计、布局管理以及业务逻辑实现(信号与槽)。

因此,本设计首先在pycharm中导入PyQt5库,接着通过第三方工具打开QT Desiger绘制好人脸检测的图形界面,然后通过PyGUI将保存好的ui文件转化成python代码,方便后续python代码嵌入到PyQt5中。

4.1.1界面布局

本设计的总布局采用垂直布局,4个单元布局从上到下垂直排列。单元布局包括相机按键布局、视频图片按键布局、显示布局和文本提示布局,各单元布局的内部控件均采用水平布局的方式。相机按键布局内部包括打开相机检测按键、录制视频按键、抓拍人脸按键和退出界面按键;视频图片按键布局中包括打开视频并检测按键、打开图片并检测按键;显示布局中仅有一个用来显示图片和视频的640*480的Label;文本提示布局中包含“当前状态”的label,和一个输出当前状态的textedit。

4.1.2 信号与槽函数

点击不同按键要实现不同功能,pyqt中使用信号与槽函数来实现按键操作与功能的连接。为实现设计目标中的功能,编写了6个槽函数。本设计的信号和槽函数的对应关系如下表1所示。

表1 信号和槽函数的对应关系表信号 槽函数打开相机并检测按键(clicked) 启动摄像头和定时器(button_open_camera_clicked)定时器结束(timeout) 人脸检测和特征点绘制(show_camera)录制视频按键(clicked) 保存视频到本地(_savevideo)抓拍人脸按键(clicked) 拍摄照片到本地(_takephoto)退出界面按键(clicked) 退出界面(_takephoto)打开视频并检测按键(clicked) 打开本地视频检测(_openvideo)打开图片并检测按键(clicked) 打开本地图片检测(openimage)

4.2人脸检测

在Python中0pencv这个库功能是非常强大的,可以调用本地摄像头,并且可以使用不同分类器对人脸进行识别。Opencv中已经包含了很多已经训练好的分类器,其中包括面部,眼睛,微笑,鼻子和嘴巴等,这些分类器分别保存在不同的XML文件中。

本设计就是使用Opencv中自带的训练器和检测器进行人脸的检测,即在Opencv中使用HaarCascade的xml分类器。Haar级联分类器通过分析对比相邻图像区域来判断给定图像或者图像区域与已知对象是否匹配。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。利用opencv里训练好的haar特征的xml文件,在图片上检测出人脸的坐标,利用这个坐标,我们可以将人脸区域剪切保存,也可以在原图上将人脸框出。

在本设计中使用该分类器的优点是简单易操作,缺点是在光线暗、脸部特征不明显等时候检测精度还有待提高。人脸和特征点的检测的过程分为以下几部分。

(1)调用摄像头,不断获取图像。

使用Opencv的VideoCapture(CAM_NUM) 调用视频。若CAM_NUM为0,则直接调用电脑的摄像头;参数是视频文件路径则打开视频。如果打开成功,则设置定时器的每次计时30ms,即每过30ms从摄像头中取一帧显示;反之,关闭定时器,释放视频流,并清空视频显示区域。为提高检测的效率,使用cv.cvtColor()对图片进行灰度处理。

(2)调用人脸分类器进行检测。

haarcascade_frontalface_default.xml文件是opencv中已经训练好的默认人脸检测器。如果在图像中检测到人脸,会以Rect(x,y,w,h)的形式返回脸部的位置,其中,(x、y)为人脸的左上角坐标,h和w分别为人脸的长和宽,从而使用一个矩形网格标识人脸。

(3)截图保存人脸。在每次检测到人脸以后,使用opencv的imwrite函数保存人脸;设置了人脸图片的最大限,如果检测到的人脸图片数量达到了设定值,或者用户按了停止检测的按键,检测结束程序退出。此外,为保证保存的人脸图像的独一性,本设计使用时间来给图像命名。引入time库,并设置时间的显示格式为%Y-%m-%d-%H-%M-%S。

(4)若检测到用户点击停止检测按键,关闭摄像头关闭,清空显示图像的label。

4.3人脸特征点绘制

本设计的人脸特征点的绘制步骤和人脸检测相似,只是首先调用 Dlib 库来进行人脸识别,然后再使用预测器 “shape_predictor_68_face_landmarks.dat”
进行68点标定,存入 68个点坐标;再使用cv2.circle 来画 68 个点;然后利用 cv2.putText() 函数来画数字 1-68;最后,通过Qlabel去呈现图像。

在用PyQt5开发GUI界面的时候,常用的呈现图像的方法有两种,第一种是通过Qlabel去呈现,另一种是通过QGraphicsView去呈现。Qlabel呈现的方式简单易于理解,本文选择第一种方法呈现图像,将人脸检测和特征点绘制的结果统一显示在界面上。另外,因为Qlabel不能直接显示img类型,需要使用函数QtGui.QImage()将其转换为QImage类型,再使用QtGui.setPixmap()添加到label中显示。

4.4 视频的录制、保存和加载

录制和保存视频:首先,使用cv2.VideoCapture(0)打开本机摄像头。接下来,只要摄像头没关闭,就一直使用cv2.VideoWriter()创建视频流写入对象,其中使用cv2.VideoWriter_fourcc(*’XVID’)设置视频的编码类型,本设计选择的是MPEG-4编码类型。为提高下面检测的准确性,使用flip()函数对图像进行了反转起到数据增强的效果。最后,检测到按键1被按下时,结束录制,保存视频到当前目录。

加载视频:使用QtWidgets中的QFileDialog.getOpenFileName()函数,读取用户手动打开的视频,将此函数的返回值视频路径名称imgName直接赋给Opencv的VideoCapture(CAM_NUM)中的CAM_NUM。因为此时CAM_NUM为视频的路径,使用VideoCapture(CAM_NUM)可以打开视频。下面调用人脸检测和人脸特征点绘制的函数,就可以完成视频的检测了。

4.5 图片的拍摄、保存和加载

拍摄和保存图片:首先导入time库,设置time显示时间的格式为%Y-%m-%d
-%H-%M-%S,以时间为拍摄的照片命名,可有效地提高图片的独一性。然后,打开相机,从视频流中提取一帧,使用cv2.cvtColor()将图片变成RGB格式。一方面,使用Qlabel的形式将图片显示在界面上,另一方面,使用opencv的imwrite()函数保存图片到本地。
加载图片:使用QtWidgets中的QFileDialog.getOpenFileName()函数,读取用户手动打开的图片,将此函数的返回值图片名称imgName,赋给opencv的imread()加载图片。要想对该图片进行检测,紧跟着调用人脸检测和特征点绘制大的函数即可。

五、总结

(1)本设计的照片检测的效果较好,视频检测的效果还有待提高。因程序采用的人脸检测和特征点检测的算法虽然简便易操作,但是在准确性不是很好,尤其是在光线昏暗、脸部倾斜等特征不明显的时候。可尝试从数据集开始,自己训练神经网络,争取得到较好的分类器和检测器。

(2)在进行视频检测时,通过Qlabel去呈现视频的速度较慢。该方法转换时间较长,我某次测算的转换时间差不多在200ms。可以尝试使用QGraphicsView去呈现视频。

(3)统计眨眼次数的功能尚未实现,需要进一步完善。

python代码提取:(包含程序解释说明、人脸识别分类器、特征点检测分类器等)

https://download.csdn.net/download/qq_38276972/13046213


推荐阅读
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • Python 第三天学习笔记
    本文详细介绍了 Python 编程的第三天学习内容,包括字符编码、文件处理以及函数的基本概念和使用方法。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 本文详细介绍了虚拟专用网(Virtual Private Network, VPN)的概念及其通过公共网络(如互联网)构建临时且安全连接的技术特点。文章探讨了不同类型的隧道协议,包括第二层和第三层隧道协议,并提供了针对IPSec、GRE以及MPLS VPN的具体配置指导。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • 本文介绍了如何使用JFreeChart库创建一个美观且功能丰富的环形图。通过设置主题、字体和颜色等属性,可以生成符合特定需求的图表。 ... [详细]
  • 本文介绍了如何在配置了virtualenv和virtualenvwrapper环境后,利用PyCharm创建新的Django项目,并将开发数据库从SQLite切换至更适用于生产环境的MySQL数据库。文章详细记录了尝试使用MySQLdb、MySQL自带Connector及pymysql等不同数据库连接库时遇到的问题及解决办法。 ... [详细]
  • Python for 循环详解及应用
    在上一篇文章中,我们探讨了 while 循环和 if 判断的使用方法。本次我们将深入讲解 for 循环,并推荐一款强大的 Python 开发工具 PyCharm,帮助你更高效地编写代码。 ... [详细]
author-avatar
后悔不够狠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有