显示视频和显示图片一样需要新建一个QLabel来显示,然后opencv格式的图片不能直接显示,需要用下面代码转换一下
- show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
- showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
- self.label_show_camera.setPixmap(QtGui.QPixmap.fromImage(showImage))
具体代码见下面:
- import sys
- import os
- import cv2
-
- from PyQt5 import QtCore, QtGui, QtWidgets
- from PyQt5.QtWidgets import *
- from PyQt5.QtCore import *
- from PyQt5.QtGui import QPalette, QBrush, QPixmap
-
-
- class Ui_MainWindow(QtWidgets.QWidget):
- def __init__(self, parent=None):
- super(Ui_MainWindow, self).__init__(parent)
-
- self.timer_camera = QtCore.QTimer() # 初始化定时器
- self.cap = cv2.VideoCapture() # 初始化摄像头
- self.CAM_NUM = 0
- self.set_ui()
- self.slot_init()
- self.__flag_work = 0
- self.x = 0
- self.count = 0
-
- def set_ui(self):
- self.__layout_main = QtWidgets.QHBoxLayout() # 采用QHBoxLayout类,按照从左到右的顺序来添加控件
- self.__layout_fun_button = QtWidgets.QHBoxLayout()
- self.__layout_data_show = QtWidgets.QVBoxLayout() # QVBoxLayout类垂直地摆放小部件
-
- self.button_open_camera = QtWidgets.QPushButton(u'打开相机')
- self.button_close = QtWidgets.QPushButton(u'退出')
-
- # button颜色修改
- button_color = [self.button_open_camera, self.button_close]
- for i in range(2):
- button_color[i].setStyleSheet("QPushButton{color:black}"
- "QPushButton:hover{color:red}"
- "QPushButton{background-color:rgb(78,255,255)}"
- "QpushButton{border:2px}"
- "QPushButton{border_radius:10px}"
- "QPushButton{padding:2px 4px}")
-
- self.button_open_camera.setMinimumHeight(50)
- self.button_close.setMinimumHeight(50)
-
- # move()方法是移动窗口在屏幕上的位置到x = 500,y = 500的位置上
- self.move(500, 500)
-
- # 信息显示
- self.label_show_camera = QtWidgets.QLabel()
- self.label_move = QtWidgets.QLabel()
- self.label_move.setFixedSize(100, 100)
-
- self.label_show_camera.setFixedSize(641, 481)
- self.label_show_camera.setAutoFillBackground(False)
-
- self.__layout_fun_button.addWidget(self.button_open_camera)
- self.__layout_fun_button.addWidget(self.button_close)
- self.__layout_fun_button.addWidget(self.label_move)
-
- self.__layout_main.addLayout(self.__layout_fun_button)
- self.__layout_main.addWidget(self.label_show_camera)
-
- self.setLayout(self.__layout_main)
- self.label_move.raise_()
- self.setWindowTitle(u'摄像头')
-
- '''
- # 设置背景颜色
- palette1 = QPalette()
- palette1.setBrush(self.backgroundRole(),QBrush(QPixmap('background.jpg')))
- self.setPalette(palette1)
- '''
-
- def slot_init(self): # 建立通信连接
- self.button_open_camera.clicked.connect(self.button_open_camera_click)
- self.timer_camera.timeout.connect(self.show_camera)
- self.button_close.clicked.connect(self.close)
-
- def button_open_camera_click(self):
- if self.timer_camera.isActive() == False:
- flag = self.cap.open(self.CAM_NUM)
- if flag == False:
- msg = QtWidgets.QMessageBox.Warning(self, u'Warning', u'请检测相机与电脑是否连接正确',
- buttons=QtWidgets.QMessageBox.Ok,
- defaultButton=QtWidgets.QMessageBox.Ok)
- # if msg==QtGui.QMessageBox.Cancel:
- # pass
- else:
- self.timer_camera.start(30)
- self.button_open_camera.setText(u'关闭相机')
- else:
- self.timer_camera.stop()
- self.cap.release()
- self.label_show_camera.clear()
- self.button_open_camera.setText(u'打开相机')
-
- def show_camera(self):
- flag, self.image = self.cap.read()
- show = cv2.resize(self.image, (640, 480))
- show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
- showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
- self.label_show_camera.setPixmap(QtGui.QPixmap.fromImage(showImage))
-
- def closeEvent(self, event):
- ok = QtWidgets.QPushButton()
- cancel = QtWidgets.QPushButton()
- msg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning, u'关闭', u'是否关闭!')
- msg.addButton(ok, QtWidgets.QMessageBox.ActionRole)
- msg.addButton(cancel, QtWidgets.QMessageBox.RejectRole)
- ok.setText(u'确定')
- cancel.setText(u'取消')
- if msg.exec_() == QtWidgets.QMessageBox.RejectRole:
- event.ignore()
- else:
- if self.cap.isOpened():
- self.cap.release()
- if self.timer_camera.isActive():
- self.timer_camera.stop()
- event.accept()
-
-
- if __name__ == '__main__':
- App = QApplication(sys.argv)
- win = Ui_MainWindow()
- win.show()
- sys.exit(App.exec_())
-
-