pyqt5和cv调用摄像头显示在label上面并有按键控制开关
时间: 2024-06-11 09:05:13 浏览: 205
以下是一个简单的示例代码,演示了如何使用PyQt5和OpenCV将摄像头的实时视频流显示在PyQt5的标签控件中,并使用按钮控制开关摄像头:
```python
import sys
import cv2
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton
class CameraWidget(QWidget):
def __init__(self):
super().__init__()
# 创建标签控件,用于显示摄像头的实时视频流
self.label = QLabel(self)
self.label.setAlignment(Qt.AlignCenter)
self.label.resize(640, 480)
# 创建按钮控件,用于控制开关摄像头
self.button = QPushButton('Start Camera', self)
self.button.move(0, 480)
self.button.clicked.connect(self.on_button_click)
# 创建定时器,用于定时刷新摄像头的实时视频流
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_frame)
self.timer.start(30)
# 创建OpenCV的摄像头对象
self.cap = cv2.VideoCapture(0)
def update_frame(self):
# 读取摄像头的一帧视频数据
ret, frame = self.cap.read()
if ret:
# 将OpenCV的图像格式转换为PyQt5的图像格式
image = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888)
pixmap = QPixmap.fromImage(image)
# 将PyQt5的图像显示在标签控件上
self.label.setPixmap(pixmap)
def on_button_click(self):
if self.cap.isOpened():
# 如果摄像头已经打开,则关闭摄像头并停止定时器
self.cap.release()
self.timer.stop()
self.button.setText('Start Camera')
else:
# 如果摄像头已经关闭,则重新打开摄像头并启动定时器
self.cap = cv2.VideoCapture(0)
self.timer.start(30)
self.button.setText('Stop Camera')
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = CameraWidget()
widget.show()
sys.exit(app.exec_())
```
在上面的代码中,我们首先创建了一个名为`CameraWidget`的自定义QWidget类,该类包含一个标签控件和一个按钮控件。在类的构造函数中,我们创建了一个OpenCV的摄像头对象,并使用定时器定时读取摄像头的实时视频流。然后,我们将每一帧视频数据转换为PyQt5的图像格式,并将其显示在标签控件上。最后,我们使用按钮控制开关摄像头,并在按钮上显示相应的文本。
在程序运行时,我们可以单击按钮控制开关摄像头。如果摄像头已经打开,则程序会关闭摄像头并停止定时器,并将按钮上的文本设置为“Start Camera”。如果摄像头已经关闭,则程序会重新打开摄像头并启动定时器,并将按钮上的文本设置为“Stop Camera”。同时,实时视频流会在标签控件中实时显示。
阅读全文