pyqt5如何通过按钮控件控制opencv在label上拍照,并把照片显示在另一个label
时间: 2023-12-29 20:02:48 浏览: 100
要实现通过按钮控制OpenCV在label上拍照,并将照片显示在另一个label上,可以使用下面的代码:
```python
import cv2
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton
from PyQt5.QtCore import QTimer
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建两个 QLabel 用于显示图像
self.label_camera = QLabel()
self.label_photo = QLabel()
# 创建一个 QPushButton 用于拍照
self.button_capture = QPushButton("Capture")
# 将 QPushButton 绑定一个槽函数
self.button_capture.clicked.connect(self.capture)
# 创建一个 QTimer 用于定时刷新摄像头
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_frame)
self.timer.start(30)
# 设置 MainWindow 的布局
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QHBoxLayout(central_widget)
layout.addWidget(self.label_camera)
layout.addWidget(self.label_photo)
layout.addWidget(self.button_capture)
# 打开摄像头
self.capture = cv2.VideoCapture(0)
self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
def update_frame(self):
# 从摄像头中读取一帧图像
ret, frame = self.capture.read()
# 将 OpenCV 的图像转换成 QImage 格式
q_image = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_RGB888).rgbSwapped()
# 将 QImage 转换成 QPixmap 格式
pixmap = QPixmap.fromImage(q_image)
# 将 QPixmap 显示在 QLabel 上
self.label_camera.setPixmap(pixmap)
def capture(self):
# 从摄像头中读取一帧图像
ret, frame = self.capture.read()
# 将 OpenCV 的图像转换成 QImage 格式
q_image = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_RGB888).rgbSwapped()
# 将 QImage 转换成 QPixmap 格式
pixmap = QPixmap.fromImage(q_image)
# 将 QPixmap 显示在 QLabel 上
self.label_photo.setPixmap(pixmap)
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
在这个例子中,我们创建了一个窗口,其中包含两个 QLabel 和一个 QPushButton。当我们单击 QPushButton 时,它会调用 `capture` 方法,该方法将从摄像头中读取一帧图像,并将其显示在第二个 QLabel 上。同时,摄像头读取的图像也会定时刷新,并在第一个 QLabel 上显示。