Python的pyqt5如何通过点击pushButton按钮来使opencv的摄像头界面拍照并显示在另一个label上
时间: 2024-03-22 17:40:00 浏览: 57
首先,你需要在PyQt5中创建一个窗口并添加一个PushButton按钮和两个Label标签。一个Label标签用于显示摄像头捕获的图像,另一个用于显示拍摄的图像。
其次,你需要使用OpenCV库来捕获摄像头的图像。在点击PushButton按钮时,你需要触发一个事件来捕获图像并将其保存为图像文件。
最后,你需要将拍摄的图像加载到第二个Label标签上。以下是示例代码:
```python
import sys
import cv2
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QDialog, QLabel, QPushButton
from PyQt5.uic import loadUi
class CameraUI(QDialog):
def __init__(self):
super(CameraUI, self).__init__()
loadUi('camera.ui', self) # 加载UI文件
self.image_label.setScaledContents(True) # 让标签自适应图片大小
self.capture = cv2.VideoCapture(0) # 打开摄像头
@pyqtSlot()
def start_camera(self):
while True:
ret, frame = self.capture.read() # 读取摄像头图像
if ret:
self.display_image(frame, 1) # 在第一个标签上显示摄像头图像
cv2.waitKey(30)
else:
break
@pyqtSlot()
def capture_image(self):
ret, frame = self.capture.read() # 读取摄像头图像
if ret:
self.display_image(frame, 2) # 在第二个标签上显示拍摄的图像
cv2.imwrite("capture.jpg", frame) # 保存拍摄的图像
cv2.waitKey(30)
def display_image(self, img, window=1):
qformat = QImage.Format_Indexed8
if len(img.shape) == 3:
if img.shape[2] == 4:
qformat = QImage.Format_RGBA8888
else:
qformat = QImage.Format_RGB888
img = QImage(img, img.shape[1], img.shape[0], qformat)
img = img.rgbSwapped()
if window == 1:
self.image_label.setPixmap(QPixmap.fromImage(img))
self.image_label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
else:
self.image_label_2.setPixmap(QPixmap.fromImage(img))
self.image_label_2.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = CameraUI()
window.show()
sys.exit(app.exec_())
```
其中,camera.ui是PyQt5 Designer创建的UI文件,包含一个MainWindow窗口、两个Label标签和两个PushButton按钮。start_camera()和capture_image()方法分别用于显示摄像头图像和拍摄图像,并将其显示在两个标签上。display_image()方法用于将OpenCV捕获的图像显示在标签上。