用Python进行人脸识别(六)

用python进行人脸识别(六)


前文讲述了Opencv的基本用法和face_recognition进行人脸识别。这篇文章介绍一下Pyqt5,并用pyqt5进行简单的界面设计。

PyQt5是由Riverbank Computing开发的一套绑定Qt5的应用程序框架,支持Pythono2.x和Python3.x版本。Qt 是一个跨平台应用程序和 UI 开发框架,使用 Qt 只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt需要用C++语言进行调用,Python在此基础上编写了调用Qt功能的库:Pyqt。因此,Pyqt的基本功能和Qt相同,作为Python语言的重要模块,拥有超过620个类和6000个函数及方法,支持Windows、linux、maxOS系统。

简单来说,pyqt使用的Qt的功能,但Qt功能需要C++来调用,为了方便开发用python写了一个API库,这就是pyqt。

Qt的核心就是信号–槽机制。信号是事件的触发信号,槽是事件执行的内容。比如设定按下一个按键后,桌面自动更换背景,按下按键就是信号,标志着事件启动,而更换背景就是槽,即事件的内容。

一个系统中可能会有多个信号、多个槽,只有把信号和槽联系起来,当信号响应时槽函数才会执行。比如有按键1、2、3、4四个按键信号,有更换背景、播放音乐、播放视频三个槽函数。将按键1与更换背景联系,将按键2与播放音乐联系,其他的都不联系。这样当按下按键1时变会更换背景,按下按键2时变会播放音乐,不会相互影响。而按键3、4没有联系槽函数,按下这两个按键什么都不会发生,同理播放视频也不会发生,除非将槽函数和某个按键联系起来。

一个信号可以对应多个槽函数,一个槽函数也可以对应多个信号。如将按键1与跟换背景、播放视频联系,则按下按键1后既会跟换背景也会播放视频,将更换背景与所有按键都联系起来,则不管按下那个按键,都会自动更换背景。

Qt可以直接用UI界面来设计各个部件,也可以用程序来设计各个部件。用UI比较直白、形象,但是对于比较精细的排版则不太方便,用程序来直接设计部件,可以定义各个部件的大小、排放位置,可以说各有千秋。新手小白直接用UI界面设计比较友好。

各个部件的大小、尺寸、颜色等等,信号–槽之间的连接,都可以通过UI或者程序来进行设计。

在UI界面设计后会自动生成一个ui文件,pyqt可以将ui文件转化为py文件,py文件中是用程序表达的各个部件,可以在UI文件中修改部件,也可以在py文件中用程序来修改部件,十分方便。

关于部件的介绍和pyqt的配置,网上有很多的资料,这里便不在赘述,贴出一些我参考的博客文章,希望对你有所帮助。

Pyqt5 +Pycahrm配置

Pyqt5使用系列教程

Pyqt窗口类型

pyqt的一个界面相当于一个类,默认自带有一个初始化方法。类内的各种方法,传入形参必须为self。

class MyWindow(QtWidgets.QMainWindow, ui):

    def __init__(self):
        super(MyWindow, self).__init__()
        self.setupUi(self)
        self.setWindowTitle("人脸识别")#设计界面名称
        self.setWindowIcon(QtGui.QIcon("pre_data/logo.jpg"))  # 设置程序的图标

        self.timer_register = QtCore.QTimer(self)
        self.timer_register.timeout.connect(self.status)  #关联的时候 方法不能加括号

由于只是简单的图形界面设计,难度不大,多尝试多联系就可以掌握。UI设计是单个单个页面的设计,假设按下界面1的某个按键后所对应的事件为:界面1关闭,界面2打开。可以使界面2实例化为界面1的一个子变量。当信号响应时,主界面关闭(隐藏不显示),子界面显示。就完成了多窗口的切换问题。这种做法可能有些野路子,没有使用控件,不过设计比较简单。

 def pushbutton(self):   #确定输入按下
    username = str(self.lineEdit.text())
    password = str(self.lineEdit_2.text())
    #提取输入的账号和密码
    
    if username == "zhongbei":
        if password == "666":#检测账号密码 如果正确
            self.next = maininterface()  #界面2实例化为界面1的变量
            self.close() #界面1隐藏
            self.next.show()#界面2 显示
        else: #密码不正确  弹出提示框
            my_button = QtWidgets.QMessageBox.information(self, '输入错误', u'请输入正确的密码')
    else:#账号不正确 弹出提示框 
        my_button = QtWidgets.QMessageBox.information(self, '输入错误', u'请输入正确的账号')

利用label控件可以实时的显示视频。label.setPixmap语句可以将图片在label上显示,采用一个定时器,不断的刷新图片,就可以达到实时显示的效果。需要注意的时,定时器的时间不能太短,要留给计算机足够的反应时间,不然可能会卡顿或者黑屏。

show = frame  #将图片frame 赋值给show变量
show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB) #格式转换
self.showimage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)#设计图片的大小 数据 格式
self.label.setPixmap(QtGui.QPixmap.fromImage(self.showimage))  #将图片用label显示

使用一个定时器与上述方法关联,启动定时器后就可以一直刷新图片。

最后在贴一下程序源码

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值