Pyqt5设计打开电脑摄像头+可选择哪个摄像头(如有多个)

目录

  • 专栏导读
  • 库的安装
  • 代码介绍
  • 完整代码
  • 总结

专栏导读

在这里插入图片描述

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

库的安装

安装作用
PyQt5pip install PyQt5界面设计
opencv-pythonpip 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基础学习专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/453221.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注册安全分析报告:北外网校

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

安装Maven配置以及构建Maven项目(2023idea)

一、下载Maven绿色软件 地址:http://maven.apache.org/download.cgi 尽量不要选择最高版本的安装,高版本意味着高风险的不兼容问题,选择低版本后续问题就少。你也可以选择尝试。 压缩后: 打开后: 在该目录下新建mvn-…

手机思维导图怎么制作?5个软件教你在手机上绘制思维导图

手机思维导图怎么制作?5个软件教你在手机上绘制思维导图 在手机上制作思维导图不仅可以帮助你快速理清思路,还可以随时随地进行创作和调整。以下是5款适合手机上绘制思维导图的软件,它们功能强大、操作简单,帮助你轻松上手。 迅…

2024年游戏买量还有空间吗?

本人从事游戏行业多年,一直做游戏分发的工作,但近年来随着我国大经济背景的整体向下,不仅仅影响了实体企业,游戏行业买量也明显受到影响。 2024年,游戏买量市场呈现出以下几个主要特点: 小游戏买量爆发&am…

大模型好书推荐 | 从入门到实践:极简大模型应用开发指南

今天给大家推荐一本大模型应用开发入门书籍《大模型应用开发极简入门》,本书对很多AI概念做了讲解和说明,主要讲解了以下几个方面的大模型技术: GPT-4和ChatGPT的工作原理: 书中详细介绍了这两个先进的语言模型的基本原理&#…

C++ : STL容器之list剖析

STL容器之list剖析 一、几个重要接口(一)push_back 与 emplace_back(二)sort1、系统中的sort2、list中的sort (三)splice(四)unique 和 merge1、unique2、merge 二、list的模拟实现&…

新手小白,如何研究货币相关性

研究货币对之间的相关性可以帮助交易者理解市场动态,从而优化交易策略。以下是一个详细的研究方向,包括每个步骤的代码,以及一些深入探索的建议。 研究方向 选择货币对:确定需要研究的两个货币对。 数据收集:获取选…

如何保证Redis和数据库的数据一致性

文章目录 0. 前言1. 补充知识:CP和AP2. 什么情况下会出现Redis与数据库数据不一致3. 更新缓存还是删除缓存4. 先操作缓存还是先操作数据库4.1 先操作缓存4.1.1 数据不一致的问题是如何产生的4.1.2 解决方法(延迟双删)4.1.3 最终一致性和强一致…

【Postman】如何导出导入数据文件?Postman链接分享?

方式一:postman分享链接 1.1 导出 1.2 导入 1.3 导入完成后删除分享的链接 方式二:postman导出导入json 2.1 导出 2.2 post导入json数据

基于asp.NET的图书借阅系统

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图 前言 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 项目介绍 随着科学技术水平的逐年发展,构建一个高效、便捷的图书借阅系统。解决传统图书馆借阅过程中存…

全面了解CAN总线协议

提及总线,总是让人联想到那些交错在一起的计算机电线。那么这些电线如何发挥功效呢?这还得配合总线协议的管理来使用。那么今天我们介绍的就是CAN总线协议。看看这个协议的含义和应用吧。 CAN总线协议基本概念 1. 报文 总线上的信息以不同格式的报文发…

工业以太网之战:EtherCAT是如何杀出重围的?

前言 EtherCAT 是一种开放的实时工业以太网协议,由德国倍福公司开发并在 2003 年 4 月的汉诺威工业博览会上首次亮相,目前由 EtherCAT 技术协会(ETG)进行维护和推广。经过 21 年的不断发展,EtherCAT 显示出极强的生命…

移动 Web核心笔记(二)

空间转换 空间:是从坐标轴角度定义的 X 、Y 和 Z 三条坐标轴构成了一个立体空间,Z 轴位置与视线方向相同。 空间转换也叫 3D转换 属性:transform 平移 /*单独设置 z轴效果不明显*/ transform: translate3d(x, y, z); transform: translateX(…

PostgreSQL学习笔记:PostgreSQL vs MySQL

PostgreSQL 和 MySQL 都是广泛使用的关系型数据库管理系统,它们有以下一些对比: 一、功能特性 1. 数据类型支持 PostgreSQL:支持丰富的数据类型,包括数组、JSON、JSONB、范围类型、几何类型等。对于复杂数据结构的存储和处理非…

多线程——单例模式

目录 前言 一、设计模式 二、饿汉模式 三、懒汉模式 1.单线程版 2.多线程版 结尾 前言 前面的几篇文章中介绍了多线程编程的基础知识,在本篇文章开始,就会利用前面的多线程编程知识来编写一些代码案例,从而使大家可以更好的理解运用多…

Cypress安装用命令安装

安装node 试一下,安装yarn 用命令安装Cypress 下面找个截图说:会给用给几个用例引导你怎么写测试脚本

阿里云 EMR Serverless Spark 版正式开启商业化

阿里云 EMR Serverless Spark 版已于2024年9月14日正式商业化售卖,本文将简要介绍 EMR Serverless Spark 的产品优势、应用场景、支持地域,及计费模式等。 EMR Serverless Spark 是一款云原生,专为大规模数据处理和分析而设计的全托管 Server…

基于JSP实习管理系统【附源码】

基于SSM的学生管理系统(源码L文说明文档) 目录 4 系统设计 4.1 系统概述 4.2系统功能结构设计 4.3数据库设计 4.3.1数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1管理员功能介绍 5.1.1管理员登录 5.1.2…

数字身份管理建设是传统社会向数字社会演进的核心关键

当前,新一轮科技革命和产业变革突飞猛进。科学技术尤其是以互联网、大数据、云计算、人工智能和区块链等为代表的数字技术正与社会交往、社会服务、社区建设、社会治理等领域不断渗透融合,社会正在由人与环境构成的物理关系总和向“万物数字化”和万物互…

重磅!望繁信科技与德勤中国签署战略合作协议

2022年,望繁信科技与德勤中国签署流程挖掘战略合作协议!双方强强联合,在拓展流程优化市场、推动企业数智融合等领域展开深度合作,持续共建具有全球影响力的流程挖掘新生态。 根据协议内容,双方计划在未来三年内&#x…