Topic: 利用pyqt5编写简单界面
Env:win10 + Pycharm2018 + Python 3.6.8
Date: 2019/4/29 by hw_Chen2018                                          CSDN:https://blog.csdn.net/qq_34198088/article/details/97893081

基本功能:利用摄像头采集使用者头像,点击“采集照片”,当前图像会“暂存”并显示在右边,“暂存”数量3。然后依次填入姓名,选择姓名,最后点击“保存”,保存照片在固定路径下。如果“暂存”图像张数小于3、未填入姓名、选择性别,会提示未进行相应操作。选择“清空”,会清空当前“暂存”图像和输入姓名字符串,以便继续录入。( 因为我这里使用的双目摄像头,显示的左右相机的输出,如果接入正常单目USB摄像头,则是正常的;与脚本同一级目录下有个img文件夹。功能简单,调用第三方库少,转载请注明出处!
界面如下图:

from cap_info import *
import cv2 as cv
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import matplotlib matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = mywindow()
w.photo_pb.clicked.connect(w.display_img)
w.show()
sys.exit(app.exec_())

脚本can_info.py如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'cap_info.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets
import cv2 as cv
import sys
import os class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(480, 480)
Form.setMinimumSize(QtCore.QSize(480, 480))
Form.setMaximumSize(QtCore.QSize(480, 480))
self.photo_pb = QtWidgets.QPushButton(Form)
self.photo_pb.setGeometry(QtCore.QRect(190, 290, 81, 31))
self.photo_pb.setStyleSheet("font: 14pt \"华文行楷\";")
self.photo_pb.setObjectName("photo_pb")
self.save_pb = QtWidgets.QPushButton(Form)
self.save_pb.setGeometry(QtCore.QRect(150, 440, 75, 31))
self.save_pb.setStyleSheet("font: 14pt \"华文行楷\";")
self.save_pb.setObjectName("save_pb")
self.photo_lbl = QtWidgets.QLabel(Form)
self.photo_lbl.setGeometry(QtCore.QRect(70, 30, 321, 251))
self.photo_lbl.setMinimumSize(QtCore.QSize(321, 251))
self.photo_lbl.setMaximumSize(QtCore.QSize(321, 251))
self.photo_lbl.setFrameShape(QtWidgets.QFrame.Box)
self.photo_lbl.setText("")
self.photo_lbl.setObjectName("photo_lbl")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(120, 350, 51, 20))
self.label.setStyleSheet("font: 14pt \"华文行楷\";")
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(120, 390, 51, 20))
self.label_2.setStyleSheet("font: 14pt \"华文行楷\";")
self.label_2.setObjectName("label_2")
self.name = QtWidgets.QLineEdit(Form)
self.name.setGeometry(QtCore.QRect(180, 350, 113, 20))
self.name.setObjectName("name")
self.radioButton = QtWidgets.QRadioButton(Form)
self.radioButton.setGeometry(QtCore.QRect(180, 390, 41, 16))
self.radioButton.setObjectName("radioButton")
self.radioButton_2 = QtWidgets.QRadioButton(Form)
self.radioButton_2.setGeometry(QtCore.QRect(240, 390, 41, 16))
self.radioButton_2.setObjectName("radioButton_2")
self.photo1 = QtWidgets.QLabel(Form)
self.photo1.setGeometry(QtCore.QRect(410, 30, 51, 71))
self.photo1.setMinimumSize(QtCore.QSize(51, 71))
self.photo1.setMaximumSize(QtCore.QSize(51, 71))
self.photo1.setFrameShape(QtWidgets.QFrame.Box)
self.photo1.setObjectName("photo1")
self.photo2 = QtWidgets.QLabel(Form)
self.photo2.setGeometry(QtCore.QRect(410, 120, 51, 71))
self.photo2.setMinimumSize(QtCore.QSize(51, 71))
self.photo2.setMaximumSize(QtCore.QSize(51, 71))
self.photo2.setFrameShape(QtWidgets.QFrame.Box)
self.photo2.setObjectName("photo2")
self.photo3 = QtWidgets.QLabel(Form)
self.photo3.setGeometry(QtCore.QRect(410, 210, 51, 71))
self.photo3.setMinimumSize(QtCore.QSize(51, 71))
self.photo3.setMaximumSize(QtCore.QSize(51, 71))
self.photo3.setFrameShape(QtWidgets.QFrame.Box)
self.photo3.setObjectName("photo3")
self.clear_pb = QtWidgets.QPushButton(Form)
self.clear_pb.setGeometry(QtCore.QRect(250, 440, 71, 31))
self.clear_pb.setStyleSheet("font: 14pt \"华文行楷\";")
self.clear_pb.setObjectName("clear_pb")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(365, 300, 101, 21))
self.label_3.setStyleSheet("font: 75 9pt \"Adobe Arabic\";")
self.label_3.setObjectName("label_3")
self.photo_num = QtWidgets.QLabel(Form)
self.photo_num.setGeometry(QtCore.QRect(430, 300, 21, 20))
self.photo_num.setText("")
self.photo_num.setObjectName("photo_num") self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "采集界面"))
self.photo_pb.setText(_translate("Form", "采集照片"))
self.save_pb.setText(_translate("Form", "保存"))
self.label.setText(_translate("Form", "姓名:"))
self.label_2.setText(_translate("Form", "性别:"))
self.radioButton.setText(_translate("Form", "男"))
self.radioButton_2.setText(_translate("Form", "女"))
self.photo1.setText(_translate("Form", "照片1"))
self.photo2.setText(_translate("Form", "照片2"))
self.photo3.setText(_translate("Form", "照片3"))
self.clear_pb.setText(_translate("Form", "清空"))
self.label_3.setText(_translate("Form", "照片数量:")) class mywindow(Ui_Form, QtWidgets.QWidget): def __init__(self):
super(mywindow, self).__init__()
self.setupUi(self) self.cap = cv.VideoCapture(0)
if not self.cap.isOpened():
QtWidgets.QMessageBox.warning(self, "警告", "未成功打开摄像头!")
self.video_timer = QtCore.QTimer()
self.photo_pb.clicked.connect(self.video_play_slot) # 显示每一帧图像
self.captureImg_flag = False # 截图控制符
self.captureImg_count = 0 # 截图数目
self.img_list = [] # 保存截图
self.captureImg_num = 0 # 截图数量 self.save_pb.clicked.connect(self.save_info) # 保存信息 self.clear_pb.clicked.connect(self.clear_content) def video_play_slot(self):
if not self.cap.isOpened():
QtWidgets.QMessageBox.warning(self, "警告", "未成功打开摄像头!请关闭界面并重新打开!")
else:
if not self.video_timer.isActive():
self.video_timer.start(30)
self.video_timer.timeout.connect(self.display_img)
else:
self.captureImg_flag = True def closeEvent(self, QCloseEvent):
'''
窗口关闭事件
:param QCloseEvent:
:return:
'''
reply = QtWidgets.QMessageBox.question(self, "确认", "确认退出吗?", QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
self.video_timer.stop()
self.cap.release()
QCloseEvent.accept()
else:
QCloseEvent.ignore() def display_img(self):
'''
显示每一帧图像
:return: 无
'''
self.photo_num.setText(str(len(self.img_list))) # 显示当前采集的照片数量 ret, frame = self.cap.read() if not ret:
print("cannot receive this frame.")
else:
frame = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
height, width, bytesPerComponent = frame.shape
bytesPerLine = bytesPerComponent * width
q_image = QtGui.QImage(frame.data, width, height, bytesPerLine,
QtGui.QImage.Format_RGB888).scaled(self.photo_lbl.width(), self.photo_lbl.height())
self.photo_lbl.setPixmap(QtGui.QPixmap.fromImage(q_image)) if self.captureImg_flag: # if self.captureImg_count == 1:
# QtWidgets.QMessageBox.information(self, "提醒", "请尽量保持所采集的照片人脸姿态多样性!") if len(self.img_list) >= 3:
self.img_list.pop(0) frame1 = frame.copy() temp = self.captureImg_count % 3
height, width, bytesPerComponent = frame1.shape
bytesPerLine = bytesPerComponent * width
q_image = QtGui.QImage(frame1.data, width, height, bytesPerLine,QtGui.QImage.Format_RGB888).scaled(self.photo1.width(), self.photo1.height())
if temp == 0:
self.photo1.setPixmap(QtGui.QPixmap.fromImage(q_image))
self.img_list.append(frame1)
# print(len(self.img_list))
elif temp == 1:
self.photo2.setPixmap(QtGui.QPixmap.fromImage(q_image))
self.img_list.append(frame1)
# print(len(self.img_list))
elif temp == 2:
self.photo3.setPixmap(QtGui.QPixmap.fromImage(q_image))
self.img_list.append(frame1)
# print(len(self.img_list)) self.captureImg_flag = False
self.captureImg_count += 1 def save_info(self):
flag1 = False
flag2 = False
flag3 = False
if len(self.img_list) < 3: # 判断照片数量
QtWidgets.QMessageBox.warning(self, "警告", "照片数量小于三张!")
else:
flag1 = True
name_str = self.name.text()
if len(name_str) == 0: # 判断是否输入姓名
QtWidgets.QMessageBox.warning(self, "警告", "姓名为空!")
else:
flag2 = True if self.radioButton.isChecked() == self.radioButton_2.isChecked(): # 判断是否选择性别
QtWidgets.QMessageBox.warning(self, "警告", "未选择性别!")
else:
flag3 = True if flag2 and flag1 and flag3:
dirname, filename = os.path.split((os.path.abspath(sys.argv[0]))) # 获取当前主运行文件绝对地址
targetpath = dirname + os.path.sep + 'img' # 构造文件路径
if not os.path.exists(targetpath): # 判断路径是否存在,不存在则创建
os.makedirs(targetpath)
# os.chdir(targetpath) # 设置当前工作路径
temp_info_text = open(dirname + os.path.sep + 'img' + os.path.sep + 'info.txt', 'x+')
temp_info_text.close()
os.chdir(targetpath)
info_text = open('info.txt','a')
for _num in range(3):
imgname = name_str + '_' + str(_num) + '.jpg'
tempimg = cv.cvtColor(self.img_list[(len(self.img_list) - _num - 1)],cv.COLOR_RGB2BGR)
cv.imencode('.jpg', tempimg)[1].tofile(imgname)
temppath = targetpath + os.path.sep + imgname + '#'
info_text.write(temppath) # 保存照片路径 if self.radioButton.isChecked():
gender = '男' + '#'
elif self.radioButton_2.isChecked():
gender = '女' + '#'
info_text.write(gender) # 写入性别信息
info_text.write('\n')
info_text.close()
QtWidgets.QMessageBox.about(self, "保存", "保存成功!") def clear_content(self):
reply = QtWidgets.QMessageBox.question(self, "清空", "确认清空所有吗?", QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
self.photo1.clear()
self.photo2.clear()
self.photo3.clear()
self.img_list.clear()
self.name.clear()
self.captureImg_count = 0 # self.radioButton.setChecked(False)
# self.radioButton_2.setChecked(False)

【QT】利用pyqt5实现简单界面的更多相关文章

  1. PyQt5系列教程(二)利用QtDesigner设计UI界面

    软硬件环境 OS X EI Capitan Python 3.5.1 PyQt 5.5.1 PyCharm 5.0.1 前言 在PyQt5系列教程的第一篇http://blog.csdn.net/dj ...

  2. qt简单界面更新代码(菜鸟级)(部分代码)

    qt简单界面更新代码(菜鸟级)(部分代码)self.timers_1=QtCore.QTimer(self)self.timers_1.timeout.connect(self.min_1)self. ...

  3. qt利用QT designer构建第一个界面helloworld工程

    qt利用QT designer构建第一个界面helloworld工程原创ZJE_ANDY 发布于2017-04-07 20:25:28 阅读数 6613 收藏展开第一步:点击New Project 第 ...

  4. python3+pyqt5+opencv3简单使用

    python3+pyqt5+opencv3简单使用(转载) 关于python3下搭建pyqt5(pycharm)参考这条链接. 对于pyqt的使用个人比较建议ui设计与逻辑功能分开开发. 下面介绍下简 ...

  5. 【python笔记】Qt+云函数 实现简单的登录框制作

    [python笔记]Qt+云函数 实现简单的登录框制作 备注:前置条件:QtDesigner.pycharm.PyQt5.配置好的云函数(百度的叫函数计算CFC,用来充当一个简陋的服务器,主要是免费) ...

  6. (一) Qt Model/View 的简单说明

    (一) Qt Model/View 的简单说明 .预定义模型 (二)使用预定义模型 QstringListModel例子 (三)使用预定义模型QDirModel的例子 (四)Qt实现自定义模型基于QA ...

  7. Qt 之 模仿 QQ登陆界面——样式篇

    一.简述 今天晚上花了半天时间从QQ登录界面抠了些图,顺便加了点样式基本上实现了QQ的登陆界面全部效果.虽不说100%相似,那也有99.99%相似了哈O(∩_∩)O. QQ好像从去年开始,登录界面有了 ...

  8. Qt Model/View 的简单说明

    目录: (一) Qt Model/View 的简单说明 .预定义模型 (二)使用预定义模型 QstringListModel例子 (三)使用预定义模型QDirModel的例子 (四)Qt实现自定义模型 ...

  9. 学习笔记:利用GDI+生成简单的验证码图片

    学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...

随机推荐

  1. P1516 青蛙的约会和P2421 [NOI2002]荒岛野人

    洛谷 P1516 青蛙的约会 . 算是手推了一次数论题,以前做的都是看题解,虽然这题很水而且还交了5次才过... 求解方程\(x+am\equiv y+an \pmod l\)中,\(a\)的最小整数 ...

  2. UIResponder相关

    UIResponder是OC中一个响应事件的类.UIApplication.UIView.UIViewController都是它的子类.UIWindow是UIView的子类,因此也能响应事件. UIR ...

  3. 【Hadoop离线基础总结】oozie定时任务设置

    目录 简介 概述 oozie定时任务设置 1.拷贝定时任务的调度模板 拷贝hello.sh脚本 3.修改配置文件 4.上传到hdfs对应路径 5.运行定时任务 简介 概述 在oozie当中,主要是通过 ...

  4. Hexo 博客利用 Nginx 实现中英文切换

    本文记录了对 Hexo 博客进行中英文切换的配置过程,实现同一应用共用模版,任何页面可以切换到另一语言的对应页面,并对未明确语言的访问地址,根据浏览器语言进行自动跳转 实现细则 中英文地址区分 博客中 ...

  5. 《C程序设计语言》 练习2-8

    问题描述 练习 2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值. Write a function rightr ...

  6. 快速了解pandas

    pandas主要就下面两方面:(只要稍微了解下面两点,那你就会用了) 1.两种数据结构(Series和DataFrame) 2.对这两种数据进行处理(主要是对DataFrame处理) -------- ...

  7. springBoot第二种配置文件yaml书写方式及读取数据、整合myBatis和整合junit

    一.yaml文件格式:key-value形式:可以表示对象 集合 1.语法:key:value 冒号后面必须跟一个空格再写value值 key1: key2: key3:value 2.属性取值:a. ...

  8. springData表关系:一对一

    一.编写两个实体类 1.一对一关系实现:a:使用外键关联 b:使用主键关联,两个表的主键相同 2.外键方案:配置关联关系:两个实体类互相关联,并且在关联的属性上添加一个@OneToOne代表一个对一个 ...

  9. 让写作省心一点——Markdown和CSS实践

    1 引言 今天这篇推送和以往不太一样,乍一看就能发现格式有了变化.没错,这是我专门设计的品牌模板,也就是本公众号以后创作的文章可直接套用,获得一致的风格样式. 除此以外,文章里的全部元素(包括标题.表 ...

  10. 力扣题解-LCP 06. 拿硬币

    题目描述 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释: ...