热门标签 | 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


推荐阅读
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ... [详细]
  • 深入解析层次聚类算法
    本文详细介绍了层次聚类算法的基本原理,包括其通过构建层次结构来分类样本的特点,以及自底向上(凝聚)和自顶向下(分裂)两种主要的聚类策略。文章还探讨了不同距离度量方法对聚类效果的影响,并提供了具体的参数设置指导。 ... [详细]
  • 计算机学报精选论文概览(2020-2022)
    本文汇总了2020年至2022年间《计算机学报》上发表的若干重要论文,旨在为即将投稿的研究者提供参考。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 在执行市场篮子分析时遇到性能瓶颈,尤其是在设定频繁项集的支持度阈值为1%时。本文探讨了如何通过调整代码和参数来提高分析效率。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • Jenkins API当前未直接提供获取任务构建队列长度的功能,因此需要通过解析HTML页面来间接实现这一需求。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 本文介绍如何在阿里云环境中利用 Docker 容器化技术部署一个简单的 Flask Web 应用,并确保其可通过互联网访问。内容涵盖 Python 代码编写、Dockerfile 配置、镜像构建及容器运行等步骤。 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
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社区 版权所有