当前位置: 代码迷 >> 综合 >> 人脸检测 pyqt+opencv+dlib
  详细解决方案

人脸检测 pyqt+opencv+dlib

热度:83   发布时间:2023-12-14 22:16:37.0

一、实验目标

绘制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