Pyqt5设计打开电脑摄像头+拍照(转载)

2023-11-15

本片为利用Pyqt5设计一个可以打开摄像头进行拍照的Demo,我感觉以后可能会有用,记录一下

Demo运行视频(哈哈感觉很好玩)

请添加图片描述

用到的模块安装:

安装 作用
PyQt5 pip install PyQt5 界面设计
opencv-python:就是cv2 pip install opencv-python==4.3.0.38(这是我之前下载的版本发现ok的) 操作摄像头

1、UI设计部分代码—代码命名:Camera.py

# -*- coding: utf-8 -*-
'''
@Time    :2023/8/21 13:53
@作者    :
@联系    :
'''
# here put the import lib
import sys
from PyQt5 import QtGui, QtWidgets
from Camera import Ui_mainWindow
import cv2
import time
from PyQt5.Qt import *


class Open_Camera(QtWidgets.QMainWindow, Ui_mainWindow):
    def __init__(self):
        super(Open_Camera, self).__init__()
        self.setupUi(self)  # 创建窗体对象
        self.init()
        self.cap = cv2.VideoCapture()  # 初始化摄像头
        self.photo_flag = 0
        self.label.setScaledContents(True)  # 图片自适应
        self.label_2.setScaledContents(True)  # 图片自适应

    def init(self):
        # 定时器让其定时读取显示图片
        self.camera_timer = QTimer()
        self.camera_timer.timeout.connect(self.show_image)
        # 打开摄像头
        self.pushButton.clicked.connect(self.open_camera)
        # 拍照
        self.pushButton_2.clicked.connect(self.taking_pictures)
        # 关闭摄像头
        self.pushButton_3.clicked.connect(self.close_camera)
        # 导入图片
        self.pushButton_4.clicked.connect(self.loadphoto)

    # 开启摄像头
    def open_camera(self):
        self.cap = cv2.VideoCapture(0)  # 摄像头
        self.camera_timer.start(40)  # 每40毫秒读取一次,即刷新率为25帧
        self.show_image()

    # 显示图片
    def show_image(self):
        flag, self.image = self.cap.read()  # 从视频流中读取图片
        width, height, _ = self.image.shape  # 行:宽,列:高
        ratio1 = width / self.label.width()  # (label 宽度)
        ratio2 = height / self.label.height()  # (label 高度)
        ratio = max(ratio1, ratio2)
        image_show = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)  # opencv读的通道是BGR,要转成RGB
        image_show = cv2.flip(image_show, 1)  # 水平翻转,因为摄像头拍的是镜像的。
        # 把读取到的视频数据变成QImage形式(图片数据、高、宽、RGB颜色空间,三个通道各有2**8=256种颜色)
        self.showImage = QtGui.QImage(image_show.data, height, width, QImage.Format_RGB888)
        self.showImage.setDevicePixelRatio(ratio)  # 按照缩放比例自适应 label 显示
        self.label.setPixmap(QPixmap.fromImage(self.showImage))  # 往显示视频的Label里显示QImage
        # self.label.setScaledContents(True) # 图片自适应

    # 拍照
    def taking_pictures(self):
        if self.cap.isOpened():
            FName = fr"images/cap{time.strftime('%Y%m%d%H%M%S', time.localtime())}"
            print(FName)
            self.label_2.setPixmap(QtGui.QPixmap.fromImage(self.showImage))
            # self.showImage.save(FName + ".jpg", "JPG", 100)
            self.showImage.save('./1.jpg')
        else:
            QMessageBox.critical(self, '错误', '摄像头未打开!')
            return None

    # 关闭摄像头
    def close_camera(self):
        self.camera_timer.stop()  # 停止读取
        self.cap.release()  # 释放摄像头
        self.label.clear()  # 清除label组件上的图片
        self.label_2.clear()  # 清除label组件上的图片
        self.label.setText("摄像头")
        # self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)  # 摄像头

    # 导入图片
    def loadphoto(self):
        fname, _ = QFileDialog.getOpenFileName(self, '选择图片', '../', 'Image files(*.jpg *.gif *.png*.bmp)')
        self.showImage = fname
        self.label_2.setPixmap(QPixmap(self.showImage).scaled(self.label_2.width(), self.label_2.height()))


if __name__ == '__main__':
    from PyQt5 import QtCore

    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)  # 自适应分辨率
    app = QtWidgets.QApplication(sys.argv)
    ui = Open_Camera()
    ui.show()
    sys.exit(app.exec_())

2、打开电脑摄像头的代码:取名—Camera_main.py

# here put the import lib
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QMessageBox
from open_camera import Ui_MainWindow
import numpy as np
import cv2
import time
from random import uniform
from PyQt5.Qt import *
 
class Open_Camera(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(Open_Camera, self).__init__()
        self.setupUi(self)  # 创建窗体对象
        self.init()
        self.cap = cv2.VideoCapture()  # 初始化摄像头
        self.photo_flag = 0
        self.label.setScaledContents(True)  # 图片自适应
        self.label_2.setScaledContents(True)  # 图片自适应
 
    def init(self):
        # 定时器让其定时读取显示图片
        self.camera_timer = QTimer()
        self.camera_timer.timeout.connect(self.show_image)
        # 打开摄像头
        self.pushButton.clicked.connect(self.open_camera)
        # 拍照
        self.pushButton_3.clicked.connect(self.taking_pictures)
        # 关闭摄像头
        self.pushButton_2.clicked.connect(self.close_camera)
        #导入图片
        self.pushButton_5.clicked.connect(self.loadphoto)
 
    '''开启摄像头'''
    def open_camera(self):
        self.cap = cv2.VideoCapture(0)  # 摄像头
        self.camera_timer.start(40)  # 每40毫秒读取一次,即刷新率为25帧
        self.show_image()
 
    '''显示图片'''
    def show_image(self):
        flag, self.image = self.cap.read()  # 从视频流中读取图片
        image_show = cv2.resize(self.image, (1280, 720))  # 把读到的帧的大小重新设置为 600*360
        # image_show = self.image
        width, height = image_show.shape[:2]  # 行:宽,列:高
        image_show = cv2.cvtColor(image_show, cv2.COLOR_BGR2RGB)  # opencv读的通道是BGR,要转成RGB
        image_show = cv2.flip(image_show, 1)  # 水平翻转,因为摄像头拍的是镜像的。
        # 把读取到的视频数据变成QImage形式(图片数据、高、宽、RGB颜色空间,三个通道各有2**8=256种颜色)
        self.showImage = QtGui.QImage(image_show.data, height, width, QImage.Format_RGB888)
        self.label.setPixmap(QPixmap.fromImage(self.showImage))  # 往显示视频的Label里显示QImage
        # self.label.setScaledContents(True) #图片自适应
 
    '''拍照'''
    def taking_pictures(self):
        if self.cap.isOpened():
            FName = fr"images/cap{time.strftime('%Y%m%d%H%M%S', time.localtime())}"
            print(FName)
            self.label_2.setPixmap(QtGui.QPixmap.fromImage(self.showImage))
            # self.showImage.save(FName + ".jpg", "JPG", 100)
            self.showImage.save('./1.jpg')
        else:
            QMessageBox.critical(self, '错误', '摄像头未打开!')
            return None
 
    '''关闭摄像头'''
    def close_camera(self):
        self.camera_timer.stop()  # 停止读取
        self.cap.release()  # 释放摄像头
        self.label.clear()  # 清除label组件上的图片
        self.label_2.clear()  # 清除label组件上的图片
        self.label.setText("摄像头")
        # self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)  # 摄像头
    #导入图片
    def loadphoto(self):
        fname, _ = QFileDialog.getOpenFileName(self, '选择图片', '../', 'Image files(*.jpg *.gif *.png*.bmp)')
        self.showImage = fname
        self.label_2.setPixmap(QPixmap(self.showImage))
 
if __name__ == '__main__':
    from PyQt5 import QtCore
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)  # 自适应分辨率
 
    app = QtWidgets.QApplication(sys.argv)
    ui = Open_Camera()
    ui.show()
    sys.exit(app.exec_())
 
 

原帖博主:点我查看

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pyqt5设计打开电脑摄像头+拍照(转载) 的相关文章

  • 包装 C++ Qt 小部件以便在 Python 中与 PySide 一起使用

    在 Python 中使用自定义 Qt 显示小部件包装自定义 C 库以便在基于 PySide 的 QApplication 中使用的最佳方法是什么 C 库是否需要特殊处理才能使用 SWIG 进行包装 封装的 Qt 小部件能否与 PySide
  • 无法隐藏 QMenu 对象 QMenu::setVisible()?

    我已经建立了一个QMenu MainMenu在我的上面MainWindow在我的应用程序中 大家都习惯了 我有以下QMenu主菜单 文件 编辑 SuperHeavyExpertMenus 设置 帮助 我想隐藏子树SuperHeaverExp
  • 删除 QComboBox“下拉”动画

    我正在使用 Qt 4 8 并且想在单击 QComboBox 时摆脱 下拉 动画 我也想稍微移动一下 到目前为止 我一直在考虑重新实现 showPopup 和 hidePopup 但不知道如何使其工作 此外 每次我尝试使用 CSS 进行移动或
  • 在哪里可以找到 Qt 的 dll 的 pdb 文件?

    我正在调试 Qt 应用程序 在哪里可以找到 Qt 的调试 dll 我在windows上使用的是vs2010 它说它需要 Qt 中的许多 dll 的 pdb 文件 从 Qt 5 9 开始 与 Windows 发行版相对应的 PDB 可作为单独
  • 获取小部件的背景颜色 - 真的

    我无法获取小部件的实际背景颜色 在我的特殊情况下 我在使用 QTabWidget 中的小部件时遇到问题 这是在Windows7上 因此 经典的小部件有一些灰色背景 而选项卡内的小部件通常用白色背景绘制 I tried def bgcolor
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • Qt GUI 编程设计

    我正在尝试创建一个 GUI 应用程序 主窗口 一个QMainWindow 包含 9 个固定大小的标签以及主窗口的大小 我尝试在没有 Qt GUI Designer 的情况下以编程方式制作它 该项目构建时没有错误 但我看不到主窗口上显示的任何
  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • Qt 支持在 QIcon 中为 SVG 着色

    看来 Qt 不支持 SVG 中路径标签上的描边 填充选项
  • 当 QML 对象不可见时防止 QML 属性绑定?

    我正在开发一个具有大量属性绑定的 QML 应用程序 数百个对象被跟踪并以不同的形式显示 例如 Qt3D QCanvas 当我在应用程序的单独页面上时 x y 位置和相对大小的属性绑定仍在发生 我怎样才能阻止他们 我知道我可以根据属性是否可视
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号

随机推荐

  • differential privacy 差分隐私入门 (二)

    书接上回 对差分隐私比较感兴趣 看了几篇文章 了解一下大概的思想 现在决定重新看一下 发现有些文章内容不是很懂 干脆就一边翻译一边看了 不懂的地方我会加下划线 如果有人看到了 还请不吝指教 注 文章是Cynthia Dwork的 Di er
  • JavaSE复习:数组

    数组 Array 是多个相同类型数据按一定顺序排列 的集合 并使用一个名字命名 并通过编号的方式 对这些数据进行统一管理 数组的常见概念 数组名 下标 或索引 元素 数组的长度 1 数组本身是引用数据类型 而数组中的元素可以是任何数据类型
  • curl访问https报错:Cert verify failed: BADCERT_NOT_TRUSTED

    这个错跟https blog csdn net lixuande19871015 article details 88788699里面的错误看上去有些不太一样 curl v https www baidu com Cert verify f
  • 神经网络记忆_带记忆的神经网络

    神经网络记忆 深度学习 DEEP LEARNING We always heard that Neural Networks NNs are inspired by biological neural networks This huge
  • 初探TVM--TVM优化resnet50

    测试用TVM编译出的resnet50在CPU上的效果 测试resnet50在CPU上的效果 编译后的resnet50模型 图像预处理 运行编译后的模型 查看输出结果 resnet50自动调优 模型调优 auto tune 编译调优过的模型
  • Java: Observer Patterns

    版权所有 2022 涂聚文有限公司 许可信息查看 描述 观察者模式 Observer Patterns 也叫做发布 订阅模式 Publist Subscribe 模型 视图模式 Model View 源 监听器 Source Listene
  • [毕业设计]最新通信工程专业毕设选题题目推荐汇总

    文章目录 1前言 2 如何选题 3 通信工程选题方向 3 1 移动通信方向 3 2 嵌入式开发方向 3 3 人工智能方向 3 4 物联网方向 3 5 算法研究方向 3 6 移动应用开发方向 3 7 网络通信方向 3 8 学长作品展示 4 最
  • DevOps到底是什么意思?

    提到DevOps这个词 我相信很多人一定不会陌生 作为一个热门的概念 DevOps近年来频频出现在各大技术社区和媒体的文章中 备受行业大咖的追捧 也吸引了很多吃瓜群众的围观 那么 DevOps是什么呢 有人说它是一种方法 也有人说它是一种工
  • 为什么要在测试集中不需要使用fit_transform的原因?

    假设我们有一组数据 10 20 30 则标准化之后的数据为 array 1 22474487 0 1 22474487 这组数据的均值为 20 0 标准差为 8 16496580927726 标准化之后的这组数据 其标准差为1 均值为0 假
  • 张钜楷:1.22黄金原油下周实时行情趋势分析及黄金独家操作建议指导

    黄金行情走势分析 周五 1月21日 国际金价进一步走低 远离隔夜创下的11月22日以来高位1847 87美元 盎司 金价对美国升息很敏感 利率上升会降低持有无孳息黄金的吸引力 但金价周线有望连续第二周收阳 本周到目前为止累计涨幅逾0 8 因
  • sql查找一列中某一数值出现次数大于2的记录

    sql查找一列中某一数值出现次数大于2的记录 百度知道
  • 机械臂控制——4

    Robot Drivers 机器人驱动程序可以控制连接到计算机的真实机器人 机器人驱动程序使用通用软件接口来控制和监视特定的机器人控制器 使计算机能够控制工业机器人 机器人驱动程序提供了脱机编程的替代方案 程序被模拟 生成 然后传输到机器人
  • python人工智能应用实例_90后博士说,从Python到人工智能只差这35个趣味案例,越学越有趣...

    有趣的生活每个人都向往 有趣的Python编程学习方式却不是每个人都体验过 以这35个趣味案例开始 让兴趣成为学习Python最好的动力 看看这35个趣味案例 几乎是每个案例都对应着一个Python的知识点 比如 以照猫画虎的案例 教你剖析
  • mysql中geometry类型的简单使用(搜索附近的人)

    mysql中geometry类型的简单使用 编写本文的目的 让和两天前的我一样的初学者 能够更快的使用geometry类型存储空间点数据 也是为了自己加深印象 更熟练的使用geometry类型 建表脚本 CREATE TABLE z gis
  • 微信小程序云开发教程一

    微信小程序云开发 初学者入门教程一 云开发环境搭建 本教程适合刚刚入门的小白 云开发为开发者提供完整的云端支持 弱化后端和运维概念 无需搭建服务器 使用平台提供的 API 进行核心业务开发 即可实现快速上线和迭代 同时这一能力 同开发者已经
  • Pandas数据分析初学--开始了解数据

    探索Chipotle快餐数据 作为一个Pandas初学者 今天用这道题目练手 分享出来 首先 impotr pandas as pd 1 将数据集存入一个名为chipo的数据框内 iris filename chipotle csv chi
  • SkyWalking链路追踪中Trace概念以及Trace与span的关系

    基本概念 在SkyWalking链路追踪中 Trace 追踪 是指一个请求或者一个操作从开始到结束的完整路径 它涵盖了分布式系统中所有相关组件的调用关系和性能信息 具体来说 Trace包含了一系列的span 跨度 每个span代表了一个组件
  • kibana使用_从kibana迁移到grafana作为elasticsearch的展现

    今天说说 我们为什么会选择从kibana迁移到grafana 并选用grafana作为elasticsearch的图表展现工具 文章中关于kinaba和grafana的对比会有些片面 勿喷 最一开始使用kibana ElasticSearc
  • java 正则表达式_a-z_0-9 validation,掌握Java-Bean Validation

    数据校验虽然简单 但是却是一个繁琐的事 我在无数的代码看到if判断参数 然后错了打日志抛异常 一片一片的这种代码 如果有点重复了 再弄出N个xxUtil来归纳代码 虽然这种做法可以达到效果 但是代码散乱 一个是编写麻烦 一个是不易阅读 Ja
  • Pyqt5设计打开电脑摄像头+拍照(转载)

    本片为利用Pyqt5设计一个可以打开摄像头进行拍照的Demo 我感觉以后可能会有用 记录一下 Demo运行视频 哈哈感觉很好玩 用到的模块安装 库 安装 作用 PyQt5 pip install PyQt5 界面设计 opencv pyth