Pyqt5设计打开电脑摄像头+可选择哪个摄像头(如有多个)
目录
- 专栏导读
- 库的安装
- 代码介绍
- 完整代码
- 总结
专栏导读
🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手
🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注
👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅
🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅
📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅
文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
❤️ 欢迎各位佬关注! ❤️
库的安装
库 | 安装 | 作用 |
---|---|---|
PyQt5 | pip install PyQt5 | 界面设计 |
opencv-python | pip install opencv-python==4.3.0.38 | 识别匹配图片 |
代码介绍
1、CameraApp 类:这是主要的应用窗口,继承自 QWidget。里面有一个 QLabel 用于显示摄像头视频流。
2、cv2.VideoCapture(0):OpenCV 用来打开默认摄像头。参数 0 表示系统的默认摄像头。
3、QTimer:每 30毫秒触发一次 update_frame(),从摄像头读取新帧并更新到窗口。
4、cv2.cvtColor:OpenCV 默认读取的图片是BGR 格式,转换成 RGB 格式才能显示在 QLabel 上
5、关闭按钮:点击按钮可以关闭摄像头并退出应用。
1、摄像头选择功能:
新增了一个 QComboBox 下拉菜单用于选择可用的摄像头,摄像头列表通过 get_available_cameras() 函数动态生成。
当用户选择不同摄像头时,change_camera() 会触发并切换到对应摄像头。
2、get_available_cameras():
该函数循环遍历可用摄像头索引,通过 cv2.VideoCapture(index) 检查摄像头是否可用,并将其添加到可选项中。
3、start_camera():
负责启动选定的摄像头,并释放之前的摄像头。
4、change_camera():
当用户在下拉菜单中选择不同的摄像头时,调用该函数来切换摄像头。
1、resizeEvent():
重写了 resizeEvent() 方法,当窗口大小发生变化时,会触发该事件,并调用 update_frame() 更新摄像头画面,使其随窗口的大小变化动态调整。
2、self.label.setAlignment(Qt.AlignCenter):
使摄像头画面居中显示,保证在窗口改变时画面居中。
3、scaled() 方法:
使用 QImage.scaled() 方法,将摄像头画面按窗口大小比例缩放,保持宽高比,确保画面不会变形。
1、Qt.WindowStaysOnTopHint:
在 self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) 中添加了该标志,以确保窗口永远保持在屏幕的最上层。
2、窗口大小策略:
使用 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding),允许窗口自由扩大或缩小,并且设置了最小窗口尺寸,防止窗口缩得过小无法使用。
3、self.setMinimumSize(400, 300):
设置了窗口的最小尺寸,避免缩小到无法正常显示摄像头画面。
4、Qt.WindowStaysOnTopHint:
仍然保持“窗口置顶”功能,确保窗口在其他应用程序上方。
完整代码
import sys
import cv2
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QComboBox, QHBoxLayout, QSizePolicy
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtGui import QImage, QPixmapclass CameraApp(QWidget):def __init__(self):super().__init__()# 初始化UI界面self.setWindowTitle("摄像头实时画面")self.setGeometry(100, 100, 800, 600)# 设置窗口永远置顶self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)# 设置窗口大小策略,允许自由调整self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)self.setMinimumSize(400, 300) # 设置最小窗口尺寸,避免窗口缩得过小# 设置布局self.main_layout = QVBoxLayout()self.controls_layout = QHBoxLayout()# QLabel用于显示摄像头画面self.label = QLabel(self)self.label.setAlignment(Qt.AlignCenter) # 居中对齐self.main_layout.addWidget(self.label)# 摄像头选择下拉菜单self.camera_selector = QComboBox(self)self.available_cameras = self.get_available_cameras()self.camera_selector.addItems(self.available_cameras)self.camera_selector.currentIndexChanged.connect(self.change_camera)self.controls_layout.addWidget(self.camera_selector)# 添加关闭按钮self.button = QPushButton('关闭摄像头', self)self.button.clicked.connect(self.close_camera)self.controls_layout.addWidget(self.button)self.main_layout.addLayout(self.controls_layout)self.setLayout(self.main_layout)# 打开默认摄像头self.capture = Noneself.current_camera_index = 0self.start_camera(self.current_camera_index)# 定时器更新视频流self.timer = QTimer(self)self.timer.timeout.connect(self.update_frame)self.timer.start(30) # 每30ms更新一次画面def get_available_cameras(self):# 获取可用摄像头的列表index = 0available_cameras = []while True:cap = cv2.VideoCapture(index)if not cap.read()[0]: # 没有更多的摄像头breakavailable_cameras.append(f"Camera {index}")cap.release()index += 1return available_camerasdef start_camera(self, camera_index):# 开启选定的摄像头if self.capture is not None:self.capture.release() # 释放前一个摄像头self.capture = cv2.VideoCapture(camera_index)def change_camera(self, index):# 切换摄像头self.current_camera_index = indexself.start_camera(self.current_camera_index)def update_frame(self):if self.capture is not None and self.capture.isOpened():ret, frame = self.capture.read()if ret:# 将OpenCV的BGR格式转换为RGB格式frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)h, w, ch = frame.shapebytes_per_line = ch * wconvert_to_Qt_format = QImage(frame.data, w, h, bytes_per_line, QImage.Format_RGB888)# 动态调整图片大小,适应窗口的大小scaled_image = convert_to_Qt_format.scaled(self.label.width(), self.label.height(), Qt.KeepAspectRatio)self.label.setPixmap(QPixmap.fromImage(scaled_image))def close_camera(self):# 关闭摄像头if self.capture is not None:self.capture.release()self.close()def resizeEvent(self, event):# 重写resizeEvent,当窗口大小改变时触发if self.capture is not None and self.capture.isOpened():self.update_frame() # 窗口大小变化时更新显示的画面super().resizeEvent(event)if __name__ == '__main__':app = QApplication(sys.argv)window = CameraApp()window.show()sys.exit(app.exec_())
总结
-
希望对初学者有帮助
-
致力于办公自动化的小小程序员一枚
-
希望能得到大家的【一个免费关注】!感谢
-
求个 🤞 关注 🤞
-
此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏
-
求个 ❤️ 喜欢 ❤️
-
此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏
-
求个 👍 收藏 👍
-
此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏
相关文章:

Pyqt5设计打开电脑摄像头+可选择哪个摄像头(如有多个)
目录 专栏导读库的安装代码介绍完整代码总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文…...
mysqldump 批量导出数据库表
先查询需要导出的数据表,使用语句 SELECT table_name FROM information_schema.tables WHERE table_schema 数据库名 AND table_name LIKE mall%; 再批量导出查询到的表 mysqldump -u root -p test_yogasala mall_ad mall_address mall_admin mall_cart mall_…...
前端工程师面试题整理
前言 本文整理了一系列前端工程师面试中常见的 HTML、CSS 和 JavaScript 问题及其答案,涵盖基础知识、常见问题及面试技巧。适用于准备前端开发职位面试的候选人参考。 目录 前言HTML & CSS1. 对 WEB 标准以及 W3C 的理解与认识2. XHTML 和 HTML 有什么区别3.…...

Linux 权限的理解
内容摘要 本文内容包括shell的运行原理,包括外壳程序的原理、理解、和意义,以及从两个方面对于权限的理解(人和事物的属性)、修改文件的权限,包括修改文件的拥有者、修改文件拥有者所在的组的用户以及修改文件的三类用…...

『完整代码』按钮开关UI界面
创建按钮Button 作为开关坐骑UI界面的按钮 创建Image 作为坐骑UI界面 在父类脚本添加其中函数即可 绑定脚本在父类窗口对象 在按钮上响应事件 隐藏UI界面 运行项目 - 实现点击按钮开关UI界面 再次点击按钮 - 关闭UI界面 end...

梦结束的地方 -- 爬楼梯
梦结束的地方 — 爬楼梯 力扣70 : 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例如下: 何解? 最后要爬上楼顶,无非两种上法,最后一…...

身份证识别JAVA+OPENCV+OCR
一、相关的地址 https://github.com/tesseract-ocr/tessdata Releases - OpenCV opencv要装好,我装的是4.5.3的,最新版的没试过。 tessdata就下载了需要用的。好像还有best和fast的版本,我试了一下报错,不知道是不是版本不支持…...

独立开发者如何利用AI实现高收入
引言 在探索独立开发领域时,AI技术的出现为开发者打开了新世界的大门。本文将分享如何利用AI技术提高开发效率,实现更高的收入。 AI在编程中的应用 AI技术的快速发展为独立开发者带来了前所未有的机遇。通过使用AI,我们可以: …...

Go第三方框架--gorm框架(一)
前言 orm模型简介 orm模型全称是Object-Relational Mapping,即对象关系映射。其实就是在原生sql基础之上进行更高程度的封装。方便程序员采用面向对象的方式来操作数据库,将表映射成对象。 这种映射带来几个好处: 代码简洁:不用…...

ONLYOFFICE文档8.2:开启无缝PDF协作
ONLYOFFICE 开源办公套件的最新版本新增约30个新功能,并修复了超过500处故障。 什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器,支持编辑处理文档、表格、幻灯片、可填写的表单和PDF。可多人在线协作,支持插件和 AI 集…...
内网python smtplib用ssh隧道通过跳板机发邮件
Python 自带 smtplib 包可以发邮件,示例见 [1,2],在邮箱设置启用 IMAP/POP3 就能用。有些邮箱需要设置授权码,如新浪、163 邮箱,然后以授权码作为 smtplib 登录服务器的密码。邮箱端配置参考 [3,4]。 现在情况是: 邮…...

基于C#开发游戏辅助工具的Windows底层相关方法详解
开发游戏辅助工具通常需要深入了解Windows操作系统的底层机制,以及如何与游戏进程进行有效交互。本文将基于C#语言,从Windows底层方法的角度来详细讲解开发游戏辅助工具的相关技术和概念。 一、游戏辅助工具的基本概述 游戏辅助工具,通常被称…...

SSRF+Redis进行内网渗透
SSRFRedis进行内网渗透 一 环境搭建 准备一台服务器,开启了lampp以及redis,redis只允许内网访问 把上面这个注释放开后,redis就只能内网访问 启动redis 使用kali进行端口扫描,扫不到6379端口 kali连接不上redis ssrf漏洞代码 &…...

栈与队列-Java【力扣】【算法学习day.7】
前言 我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&#…...

最新版本!IntelliJ IDEA 2024.2.4 (Ultimate Edition) 的新特性
IntelliJ IDEA 2024.2版本(Ultimate Edition)的关键新特性包括: 改进的Spring Data JPA支持: 允许在IDE中直接运行Spring Data JPA方法,进行即时仓库查询验证。 无需运行应用程序或分析日志文件,即可查看…...

从头学PHP之运算符
关于运算符的图片均来自网络,主要是自己写太麻烦了,程序是个简化自己工作量的方式,能复制粘贴就不要手写了(建议初期还是多写写,加深下记忆)在这里我就偷个懒,图片涉及到侵权及时,请…...

使用 Git LFS(大文件存储)
Git LFS(Large File Storage)是一种扩展 Git 的工具,旨在更有效地管理大文件的版本控制。它通过将大文件的内容存储在 Git 之外来解决 Git 在处理大文件时的性能问题。 主要特点 替代存储:Git LFS 不直接将大文件存储在 Git 仓库…...
js 将一维数组转换成树形结构的方法
一维数组的数据结构,如下 const flatArray [ { id: 1, parent_id: null, name: ‘root1’ }, { id: 2, parent_id: null, name: ‘root2’ }, { id: 3, parent_id: 1, name: ‘child1’ }, { id: 4, parent_id: 2, name: ‘child2’ }, { id: 5, parent_id: 3, nam…...
HarmonyOS NEXT开发实战:实现高效下拉刷新与上拉加载组件(二)刷新核心逻辑与空页面集成
前言: 在上一篇文章中,我们深入探讨了如何在HarmonyOS中实现一个功能完备的空页面组件。现在,我们将进入下拉刷新和上拉加载功能的核心逻辑实现。这不仅仅是技术实现,更是对用户体验的深刻理解。本文将详细介绍如何将空页面与下拉刷新、上拉加载逻辑相结合,打造一个既高效…...

Crawler4j在多线程网页抓取中的应用
网页爬虫作为获取网络数据的重要工具,其效率和性能直接影响到数据获取的速度和质量。Crawler4j作为一个强大的Java库,专门用于网页爬取,提供了丰富的功能来帮助开发者高效地抓取网页内容。本文将探讨如何利用Crawler4j进行多线程网页抓取&…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...