基于PyQt5和GUI编程实现的实时图像获取及处理的人脸识别系统

发布于:2022-12-07 ⋅ 阅读:(631) ⋅ 点赞:(0)

目 录
摘 要 I
Abstract II

第 1 章 绪 论
1.1课题背景及研究的目的和意义 1
1.2课题国内外研究概况 1
1.3摄像头图像获取及人脸检测与识别的应用 3
1.4本文的主要研究内容 4
第 2 章 实时图像获取及处理的相关原理
2.1实时图像获取设备 5
2.1.1USB 摄像头图像采集原理 5
2.1.2Windows 操作系统下摄像头的驱动 6
2.2数字图像处理与人脸识别原理 7
2.2.1图像处理基础 7
2.2.2基于机器学习的人脸检测与识别 10
2.3 本章小结 11
第 3 章 基于 Python 的软件设计与编程
3.1图形用户界面设计 12
3.2程序结构设计 13
3.3利用 OpenCV 获取图像 14
3.3.1从摄像头获取图像 14
3.3.2摄像头相关参数获取与设置 15
3.3.3保存图像和视频 16
3.4使用 OpenCV 进行图像处理 17
3.4.1基本图像处理 17
3.4.2人脸检测与识别 18
3.5PyQt 5 和 GUI 编程 21
3.5.1QMainWindow 窗口控件 21
3.5.2在 PyQt 界面上显示实时画面 22
3.5.3弹出对话框的使用 23
3.5.4利用按钮实现暂拍照、录像和暂停功能 24
3.5.5在 PyQt 中应用 Matplotlib 绘制灰度直方图 25
3.5.6使用 Qt Designer 实现界面显示与业务逻辑的分离 26
3.6软件打包与测试 27
3.7 本章小结 28
结 论 29
参考文献 30
致 谢 31
附录Ⅰ 软件总体设计框图 32
附录Ⅱ 毕业设计软件效果 33

1.4本文的主要研究内容
本文是在摄像头图像获取和数字图像处理对相关原理进行广泛研究的基础上, 在 Windows 系统下基于 Python 语言开发的图像获取与处理软件。其中,图像获取 使用的便是 USB 摄像头,并且能够摄像头部分属性参数进行调整以便获取更高质量的数字图像。而图像处理部分从基础操作,如灰度化、直方图,到边缘检测技术, 最终实现人脸检测与识别。针对这些需求,选用开源的可以跨平台运行的计算机视觉库 OpenCV 来实现各种功能。最后使用 GUI 开发库 PyQt 5 整合各功能模块,编 写生成可执行的软件供用户使用。
文章结构清晰,第二章介绍相关原理,第三章介绍具体的技术实现方法。每一章内部大致可以区分为图像获取和图像处理两大部分,第三章另外介绍了使用PyQt 5 进行 GUI 编程和软件打包的相关内容。
第 3 章 基于 Python 的软件设计与编程
本课题使用 Python 作为编程语言。诞生于 1989 年的 Python 语言,作为第四代计算机编程语言 ,具有卓越的通用性高效性、平台移植性和安全性,同时又因其功能强大的解释性、交互性和面向对象编程的特性,既简单易学、又清晰高效, 成为当下极为流行的编程语言之一。
Python 代码很容易阅读和编写,并且非常清晰没有什么隐秘的。Python 是一种表达能力非常强的语言, 这意味着, 在设计同样的应用程序时, 使用Python 进行编码所需要的代码量远少于其他语言的代码量。目前 Python 官方网站版本已经更新至 Python 3.6.4 和 Python 2.7.14,强大的标准库奠定了 Python 发展的基石,丰富的第三方库保证了 Python 不断发展的,其开源特性和活跃的社区更是提供了强大的发展动力。
Python 自带的 IDLE,精简又方便,不过一个好的编辑器能让 python 编码变得更方便,更加优美些。常用的 Python 编译器有 PyCharm、Sublime 等。不过本课题选用 Visual Studio Code 作为编译器。本文转载自http://www.biyezuopin.vip/onews.asp?id=14879这是微软公司发布的一款跨平台编辑器,轻便又易用。
当我们搭建好 Python 开发环境,安装好编译器以后,就可以着手开始软件编写了。接下了一整章的内容,我们将详细介绍如何基于 Python 语言实现本课题的所有功能。
3.1图形用户界面设计
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。在目前的软件设计过程中,用户界面的设计是相当重要的部分,美观、实用、大方的用户界面,能够极大的提高用户体验和软件亲和力。
本课题的所有功能,最终都将呈现在 GUI 上,所以在软件总体设计阶段,对
GUI 界面的设计是首当其冲的。本次毕业设计软件界面的主要功能结构设计如下图 3-1 所示。
作为一款成熟的软件,标题栏、菜单栏、中心窗口是必不可少的。图像获取和处理的结果将直接在窗口中展示,实时参数、实时图像、灰度图像、边缘检测图像和灰度直方图等。而各种功能的调用除了可以在菜单栏找到外,在中心窗口的合适位置也将放置部分按钮以方便用户操作。而相对复杂的设置等,会通过弹出对话框的形式处理。同时,状态栏将会实时展示程序的各种运行状态。

#USB摄像头图像获取及处理软件

#刘阳
#使用Matplotlib绘制直方图

import sys
import matplotlib
import cv2

matplotlib.use("Qt5Agg")
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QWidget
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

class MyMplCanvas(FigureCanvas):
    """FigureCanvas的最终的父类其实是QWidget。"""
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        # 配置中文显示
        plt.rcParams['font.family'] = ['SimHei']  # 用来正常显示中文标签
        plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

        self.fig = Figure(figsize=(width, height), dpi=dpi)  # 新建一个figure
        self.axes = self.fig.add_subplot(111)  # 建立一个子图,如果要建立复合图,可以在这里修改
        self.fig.subplots_adjust(left=0.180, bottom=0.110, right=0.990, top=0.990,wspace=None, hspace=None)

        #self.axes.hold(False)  # 每次绘图的时候不保留上一次绘图的结果

        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)

        '''定义FigureCanvas的尺寸策略,这部分的意思是设置FigureCanvas,使之尽可能的向外填充空间。'''
        FigureCanvas.setSizePolicy(self,QSizePolicy.Expanding,QSizePolicy.Expanding)

        FigureCanvas.updateGeometry(self)

    '''绘图,可以在这里定义自己的绘图逻辑'''
    def plot(self,histr=[0]):
        
        self.axes.cla()
        self.axes.plot(histr)
        self.axes.set_ylabel('像素值数量')
        self.axes.set_xlabel('灰度级')
        self.axes.set_xlim((0,256))
        #self.axes.grid(True)
        self.draw()

class MatplotlibWidget(QWidget):
    def __init__(self, parent=None):
        super(MatplotlibWidget, self).__init__(parent)
        self.initUi()

    def initUi(self):
        self.layout = QVBoxLayout(self)
        self.histMP = MyMplCanvas(self, width=3.78, height=3.86, dpi=100)
        #self.histMP.plot() # 如果你想要初始化的时候就呈现静态图,请把这行注释去掉
        self.layout.addWidget(self.histMP)

        #self.mpl_ntb = NavigationToolbar(self.histMP, self)  # 添加完整的 toolbar
        #self.layout.addWidget(self.mpl_ntb)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = MatplotlibWidget()
    img = cv2.imread(r'image/lena.jpg')
    img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    histr = cv2.calcHist([img],[0],None,[256],[0,256])
    ui.histMP.plot(histr)     #测试静态图效果
    #ui.Tool()
    ui.show()
    sys.exit(app.exec_())

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到