专栏导读
 

 
 -  
🌸 欢迎来到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__()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()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)  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: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):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基础学习专栏