python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第1张图片

学习了PyQt5,可以使用python设计出基于Qt的各种GUI,OpenCV是机器视觉处理库,提供了Python语言的接口,今天就尝试在使用PyQt5开出出来的界面上,显示使用OpenCV库采集到的摄像头视频数据。

电脑中的Python路径有点问题,因为初学的时候,按照教程里面的步骤安装python的开发环境,一种是下载基本版的python环境,我在电脑中的路径是:“C:PythonPython36”,系统的环境变量配置,

b0ad1f8c9b6466b2e339473df05a708c.png

另一种是安装Anaconda,Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第2张图片

结果我两种方法都安装了,而且路径不一样,这样导致了我在控制台使用python解释器,和PyCharm使用的解释器不是一个,而且包含的各种库也不一样,这个问题在像我这样的新手小白可能会遇到,请大家注意下。

一、PyCharm+PyQt5的环境配置

可以自行在网上搜索,这里就不论述了。

二、OpenCV的安装与配置

1、Windows下OpenCV的安装,可以直接使用pip

pip install opencv-contrib-python --upgrade

测试OpenCV是否安装完成

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第3张图片

2、由于我们已经安装了OpenCV库,如果代码输入import cv2,还是提示找不到模块的 话,可能也和笔者一样,弄错的python库的位置,可以在PyCharm中重新设置一下。

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第4张图片

三、使用OpenCV播放摄像头视频

新建一个camera-text.py文件,内容如下:

import numpy as np
import cv2

#read camera
cap = cv2.VideoCapture(0)
 
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
 
    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

在这段代码中,为了获取视频,需要创建一个VideoCapture对象,参数可以是设备的索引号,或者是图片或者视频文件。设备索引号就是指定当前要使用的摄像头。一般默认的摄像头参数就是0,可以设置成1或者其它来选择别的摄像头。

保存这段代码,然后使用python命令运行它,就可以显示摄像头采集到的数据。代码里面显示gray是黑白图像,如果显示frame则是彩色图像。

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第5张图片
cv2

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第6张图片

四、使用PyQt5搭建界面

1、使用Qt Designer搭建一个界面,摄像头显示区域我们使用QLabel控件,尺寸设置为480x320,保存为camerapage.ui文件。

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第7张图片

使用pyuic5将camerapage.ui文件转换为ui_camerapage.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", "下"))

五、在Qt界面中显示OpenCV采集到视频信息

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

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from HomePages.ui_camerapage 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('打开摄像头')
 

这样就实现了在PyQt5的界面中使用OpenCV来播放摄像头视频了。

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第8张图片

点击“打开摄像头”:

python opencv 界面按钮_2.使用PyQt5+OpenCV显示摄像头图像_第9张图片

点击“关闭摄像头”,则关闭摄像头并且清空QLabel的数据。

你可能感兴趣的:(python,opencv,界面按钮)