这个示例创建了一个CameraWidget
类,继承自QWidget
。它包含一个QLabel
用于显示摄像头图像,并通过定时器不断读取摄像头图像进行显示。在update_frame
方法中,调用cv2.VideoCapture
读取摄像头图像,将BGR颜色空间转换为RGB,并使用QImage
和QPixmap
进行图像格式转换和尺寸调整,然后在QLabel
中显示。
在main
函数中创建了一个QApplication
对象,并实例化CameraWidget
类,最后启动应用程序的事件循环。
import sys
import cv2
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
class CameraWidget(QWidget):
def __init__(self):
super().__init__()
self.camera = cv2.VideoCapture(0) # 打开摄像头
self.image_label = QLabel(self) # 显示图像的Label
layout = QVBoxLayout(self)
layout.addWidget(self.image_label)
self.timer = QTimer() # 定时器,用于不断读取图像
self.timer.timeout.connect(self.update_frame)
self.timer.start(30) # 设置每30毫秒触发一次
self.resize(800, 600) # 设置窗口大小
def update_frame(self):
ret, frame = self.camera.read() # 读取摄像头图像
if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 转换颜色空间
image = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888)
pixmap = QPixmap.fromImage(image)
self.image_label.setPixmap(pixmap.scaled(self.image_label.size().width() - 20, self.image_label.size().height() - 20, Qt.KeepAspectRatio))
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = CameraWidget()
widget.show()
sys.exit(app.exec_())