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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 深入解析三大范式与JDBC集成
    本文详细探讨了数据库设计中的三大范式,并结合Java数据库连接(JDBC)技术,讲解如何在实际开发中应用这些概念。通过实例和图表,帮助读者更好地理解范式理论及其在数据操作中的重要性。 ... [详细]
  • 本文详细介绍了Python中函数的基本概念,包括函数的定义与调用、文档注释、参数传递(形参与实参)、返回值以及函数嵌套。通过具体示例和解释,帮助读者掌握函数在编程中的应用。 ... [详细]
  • 网络出版服务许可证申请指南
    本文详细介绍了网络出版服务许可证的办理条件、适用企业范围及具体流程,帮助相关企业和个人了解并顺利完成许可证的申请。文章由专业机构提供,旨在为读者解答在互联网出版领域遇到的技术和合规问题。 ... [详细]
  • Python Django大学生心理健康管理系统开发(含源码、文档)
    本项目包含完整的源代码、设计文档、数据库结构以及详细的安装指南,旨在为计算机专业的学生提供一个全面的心理健康管理系统解决方案。 ... [详细]
  • 精选多款高效实用软件及工具推荐
    本文介绍并推荐多款高效实用的软件和工具,涵盖系统优化、网络加速、多媒体处理等多个领域,并提供安全可靠的下载途径。 ... [详细]
  • C语言实现推箱子游戏的完整代码
    本文详细介绍了如何使用C语言在Linux环境下实现一个简单的推箱子游戏,包括游戏的基本规则、地图设计及代码实现。适合C语言初学者学习。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 智慧城市建设现状及未来趋势
    随着新基建政策的推进及‘十四五’规划的实施,我国正步入以5G、人工智能等先进技术引领的智慧经济新时代。规划强调加速数字化转型,促进数字政府建设,新基建政策亦倡导城市基础设施的全面数字化。本文探讨了智慧城市的发展背景、全球及国内进展、市场规模、架构设计,以及百度、阿里、腾讯、华为等领军企业在该领域的布局策略。 ... [详细]
  • 地球坐标、火星坐标及百度坐标间的转换算法 C# 实现
    本文介绍了WGS84坐标系统及其精度改进历程,探讨了火星坐标系统的安全性和应用背景,并详细解析了火星坐标与百度坐标之间的转换算法,提供了C#语言的实现代码。 ... [详细]
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社区 版权所有