使用PyQt5+OpenCV显示摄像头图像

使用PyQt5+OpenCV显示摄像头图像

使用pyuic5将ui文件转换为ui.py文件,内容如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'camerapage.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_CameraPage(object):
	def setupUi(self, CameraPage):
		CameraPage.setObjectName("CameraPage")
		CameraPage.resize(855, 443)
		self.layoutWidget = QtWidgets.QWidget(CameraPage)
		self.layoutWidget.setGeometry(QtCore.QRect(30, 30, 757, 348))
		self.layoutWidget.setObjectName("layoutWidget")
		self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
		self.gridLayout.setContentsMargins(8, 8, 8, 8)
		self.gridLayout.setObjectName("gridLayout")
		self.rightButton = QtWidgets.QPushButton(self.layoutWidget)
		self.rightButton.setMinimumSize(QtCore.QSize(80, 80))
		self.rightButton.setMaximumSize(QtCore.QSize(80, 80))
		font = QtGui.QFont()
		font.setPointSize(14)
		self.rightButton.setFont(font)
		self.rightButton.setObjectName("rightButton")
		self.gridLayout.addWidget(self.rightButton, 1, 2, 1, 1)
		self.leftButton = QtWidgets.QPushButton(self.layoutWidget)
		self.leftButton.setMinimumSize(QtCore.QSize(80, 80))
		self.leftButton.setMaximumSize(QtCore.QSize(80, 80))
		font = QtGui.QFont()
		font.setPointSize(14)
		self.leftButton.setFont(font)
		self.leftButton.setObjectName("leftButton")
		self.gridLayout.addWidget(self.leftButton, 1, 0, 1, 1)
		self.returnButton = QtWidgets.QPushButton(self.layoutWidget)
		font = QtGui.QFont()
		font.setPointSize(14)
		self.returnButton.setFont(font)
		self.returnButton.setObjectName("returnButton")
		self.gridLayout.addWidget(self.returnButton, 4, 0, 1, 3)
		self.cameraButton = QtWidgets.QPushButton(self.layoutWidget)
		font = QtGui.QFont()
		font.setPointSize(14)
		self.cameraButton.setFont(font)
		self.cameraButton.setObjectName("cameraButton")
		self.gridLayout.addWidget(self.cameraButton, 3, 0, 1, 3)
		self.cameraLabel = QtWidgets.QLabel(self.layoutWidget)
		self.cameraLabel.setMinimumSize(QtCore.QSize(480, 320))
		font = QtGui.QFont()
		font.setPointSize(14)
		self.cameraLabel.setFont(font)
		self.cameraLabel.setObjectName("cameraLabel")
		self.gridLayout.addWidget(self.cameraLabel, 0, 3, 5, 1)
		self.upButton = QtWidgets.QPushButton(self.layoutWidget)
		self.upButton.setMinimumSize(QtCore.QSize(80, 80))
		self.upButton.setMaximumSize(QtCore.QSize(80, 80))
		font = QtGui.QFont()
		font.setPointSize(14)
		self.upButton.setFont(font)
		self.upButton.setObjectName("upButton")
		self.gridLayout.addWidget(self.upButton, 0, 1, 1, 1)
		self.downButton = QtWidgets.QPushButton(self.layoutWidget)
		self.downButton.setMinimumSize(QtCore.QSize(80, 80))
		self.downButton.setMaximumSize(QtCore.QSize(80, 80))
		font = QtGui.QFont()
		font.setPointSize(14)
		self.downButton.setFont(font)
		self.downButton.setObjectName("downButton")
		self.gridLayout.addWidget(self.downButton, 2, 1, 1, 1)
		
		self.retranslateUi(CameraPage)
		QtCore.QMetaObject.connectSlotsByName(CameraPage)

 def retranslateUi(self, CameraPage):
	_translate = QtCore.QCoreApplication.translate
	CameraPage.setWindowTitle(_translate("CameraPage", "摄像头界面"))
	self.rightButton.setText(_translate("CameraPage", "右"))
	self.leftButton.setText(_translate("CameraPage", "左"))
	self.returnButton.setText(_translate("CameraPage", "返回"))
	self.cameraButton.setText(_translate("CameraPage", "打开摄像头"))
	self.cameraLabel.setText(_translate("CameraPage", "摄像头画面"))
	self.upButton.setText(_translate("CameraPage", "上"))
	self.downButton.setText(_translate("CameraPage", "下"))

新建一个业务逻辑处理文件call_camerapage.py文件,在这个文件中我们可以实现业务逻辑,代码如下:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from ui import Ui_CameraPage

import numpy as np
import cv2

class CameraPageWindow(QWidget,Ui_CameraPage):
	returnSignal = pyqtSignal()
	def __init__(self,parent=None):
		super(CameraPageWindow, self).__init__(parent)
		self.timer_camera = QTimer() #初始化定时器
		self.cap = cv2.VideoCapture() #初始化摄像头
		self.CAM_NUM = 0
		self.setupUi(self)
		self.initUI()
		self.slot_init()

def initUI(self):
	 self.setLayout(self.gridLayout)

def slot_init(self):
	 self.timer_camera.timeout.connect(self.show_camera)
	        #信号和槽连接
	 self.returnButton.clicked.connect(self.returnSignal)
	 self.cameraButton.clicked.connect(self.slotCameraButton)

def show_camera(self):
     flag,self.image = self.cap.read()
     show = cv2.resize(self.image,(480,320))
     show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
     showImage = QImage(show.data, show.shape[1],show.shape[0],QImage.Format_RGB888)
	 self.cameraLabel.setPixmap(QPixmap.fromImage(showImage))

 #打开关闭摄像头控制
def slotCameraButton(self):
	 if self.timer_camera.isActive() == False:
		#打开摄像头并显示图像信息
		self.openCamera()
else:
	#关闭摄像头并清空显示信息
	self.closeCamera()

 #打开摄像头
def openCamera(self):
	flag = self.cap.open(self.CAM_NUM)
	if flag == False:
		msg = QMessageBox.Warning(self, u'Warning', u'请检测相机与电脑是否连接正确',
		buttons=QMessageBox.Ok,
		defaultButton=QMessageBox.Ok)
	else:
		self.timer_camera.start(30)
		self.cameraButton.setText('关闭摄像头')

    #关闭摄像头
 def closeCamera(self):
	 self.timer_camera.stop()
	 self.cap.release()
	 self.cameraLabel.clear()
	 self.cameraButton.setText('打开摄像头')
 

核心代码:

class mwindow(QWidget, Ui_Dialog):
    def __init__(self):
        super(mwindow, self).__init__()
        self.setupUi(self)
        self.video_init()

    def show_camera(self):
        success, img = self.cam.read()  # 从摄像头读取照片
        img = cv2.flip(img, 1) 
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        qImg=qimage2ndarray.array2qimage(img)
        pixmap = QPixmap.fromImage(qImg)
        pixmap = pixmap.scaled(self.label_2.size(), Qt.KeepAspectRatio)
        self.label_2.setPixmap(pixmap)


    def video_init(self):
        self.cam = cv2.VideoCapture(0) #初始化摄像头
        self.timer_camera = QTimer() #初始化定时器
        self.timer_camera.timeout.connect(self.show_camera)
        self.timer_camera.start(30)

效果:

使用PyQt5+OpenCV显示摄像头图像_第1张图片
有问题添加QQ群:686070107

你可能感兴趣的:(python,qt,pyqt5,opencv,视频)