pyqt多线程打开多个摄像头
时间: 2023-06-28 10:12:47 浏览: 107
要在PyQt中使用多线程打开多个摄像头,可以使用Python线程和OpenCV库。以下是一个简单的示例代码,可以同时打开两个USB摄像头:
```python
import cv2
import sys
from PyQt5.QtCore import QThread, QTimer
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QDialog, QLabel
class CameraThread(QThread):
def __init__(self, camera_id):
super().__init__()
self.camera_id = camera_id
self.image = None
def run(self):
cap = cv2.VideoCapture(self.camera_id)
while True:
ret, frame = cap.read()
if ret:
self.image = frame
class CameraWidget(QLabel):
def __init__(self, camera_id):
super().__init__()
self.camera_thread = CameraThread(camera_id)
self.camera_thread.start()
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_frame)
self.timer.start(50)
def update_frame(self):
if self.camera_thread.image is not None:
image = QImage(self.camera_thread.image.data, self.camera_thread.image.shape[1], self.camera_thread.image.shape[0], QImage.Format_RGB888)
pixmap = QPixmap.fromImage(image.rgbSwapped())
self.setPixmap(pixmap)
class MainWindow(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("Multiple Cameras")
self.camera1 = CameraWidget(0)
self.camera2 = CameraWidget(1)
layout = QVBoxLayout()
layout.addWidget(self.camera1)
layout.addWidget(self.camera2)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
此示例代码中,CameraThread类定义了一个线程,用于从摄像头读取图像。CameraWidget类继承自QLabel,用于显示摄像头图像,并且使用QTimer定时更新图像。MainWindow类则是一个简单的窗口,包含两个CameraWidget实例。
在这个示例中,我们使用OpenCV库读取摄像头图像,然后将其转换为QImage和QPixmap格式,以便在PyQt窗口中显示。每个摄像头都在自己的线程中运行,以避免阻塞主线程。