【OpenCV】Pyqt5界面设计+USB摄像头


前言

用Python编写一个Pyqt5的GUI界面,包含5个按键,功能是打开、关闭摄像头,捕获图片,读取本地图片,灰度化和Otsu自动阈值分割5个功能。


一、界面设计

1.新建一个pyqt5文件夹,鼠标右键,点击外部工具,打开qt designer工具。也可以搜索designer.exe软件直接打开。

2.创建组件
在这里插入图片描述
在这里插入图片描述
设置5个按键。大小可以自己调整。

在这里插入图片描述
设置3个label,大小设置为200*200。

每个控件得自定义一下名称,方便编写代码的时候找到是哪个控件。

控件控件上显示的内容text控件名objectName
PushButton(第1个)开启摄像头Button_OpenCamera
PushButton(第2个)截图Button_Capture
PushButton(第3个)打开图片Button_ReadImage
PushButton(第4个)灰度化Button_Gray
PushButton(第5个)阈值分割Button_Threshold
Label(第1个)摄像头显示图像label_Camera
Label(第2个)摄像头截图label_Capture
Label(第3个)结果图像label_Result

在这里插入图片描述
不仅仅是界面显示文本需要修改,控件名称也需要修改。看图中2的位置,参考上表格修改。
在这里插入图片描述

在这里插入图片描述
修改后的结果可在此处看到。
界面基本完成以后,接下来需要实现五个按钮的功能,每个按钮指定一个函数,实现功能的逻辑代码写在这个函数内部。
这个函数就称为事件,Qt中称为槽连接。
点击Designer工具栏的Edit 按钮,进入Signals/Slots槽函数编辑信号界面,点击ESC按键可以恢复正常视图。
在这里插入图片描述
在这里插入图片描述
选择点击事件”clicked()”,然后添加一个名为”OpenCamera_Clicked()”的槽函数。或者可以先编辑好红色方框的5个函数,然后通过拉拽的方式把按键一个一个配对上,左边事件每个按钮都选Clicked()。
请注意,使用我的代码的话,函数名称必须和我的保持一致,否则容易报错,知道报错也可以自己修改就是。

Button_Threshold_Clicked()
Button_Gray_Clicked()
Button_ReadImage_Clicked()
Button_Capture_Clicked()
Button_OpenCamera_Clicked()

Button_Threshold_Clicked()实现阈值分割功能;
Button_Gray_Clicked()实现灰度化功能
Button_ReadImage_Clicked()实现读图功能
Button_Capture_Clicked()实现截图功能
Button_OpenCamera_Clicked()打开摄像头功能
在这里插入图片描述
最终结果如下:
在这里插入图片描述
Ctrl + S保存.ui文件。建议修改下文件名称,这里修改为demo.ui。接下去需要将ui转py代码。
在这里插入图片描述
选工具pyuic即可。此时产生相同名字的demo.py
在这里插入图片描述

二、编写代码

demo.py是根据ui文件生成的,如果ui界面设计有改变,需要重新生成覆盖原来的文件。
1.新建一个myqt.py文件存放逻辑代码。

import sys
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QFileDialog, QMainWindow
from demo import Ui_MainWindow


class PyQtMainEntry(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.camera = cv2.VideoCapture(0)
        self.is_camera_opened = False  # 摄像头有没有打开标记

        # 定时器:30ms捕获一帧
        self._timer = QtCore.QTimer(self)
        self._timer.timeout.connect(self._queryFrame)
        self._timer.setInterval(30)

    def Button_OpenCamera_Clicked(self):   #打开和关闭摄像头
        self.is_camera_opened = ~self.is_camera_opened
        if self.is_camera_opened:
            self.Button_OpenCamera.setText("关闭摄像头")
            self._timer.start()
        else:
            self.Button_OpenCamera.setText("打开摄像头")
            self._timer.stop()

    def Button_Capture_Clicked(self):#        捕获图片

        # 摄像头未打开,不执行任何操作
        if not self.is_camera_opened:
            return

        self.captured = self.frame
        # 后面这几行代码几乎都一样,可以尝试封装成一个函数
        rows, cols, channels = self.captured.shape
        bytesPerLine = channels * cols
        # Qt显示图片时,需要先转换成QImgage类型
        QImg = QImage(self.captured.data, cols, rows, bytesPerLine, QImage.Format_RGB888)
        self.label_Capture.setPixmap(QPixmap.fromImage(QImg).scaled(self.label_Capture.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))

    def Button_ReadImage_Clicked(self):#从本地读取图片 文件路径不能有中文
        # 打开文件选取对话框
        filename, _ = QFileDialog.getOpenFileName(self, '打开图片')
        if filename:
            self.captured = cv2.imread(str(filename))
            # OpenCV图像以BGR通道存储,显示时需要从BGR转到RGB
            self.captured = cv2.cvtColor(self.captured, cv2.COLOR_BGR2RGB)

            rows, cols, channels = self.captured.shape
            bytesPerLine = channels * cols
            QImg = QImage(self.captured.data, cols, rows, bytesPerLine, QImage.Format_RGB888)
            self.label_Capture.setPixmap(QPixmap.fromImage(QImg).scaled(
                self.label_Capture.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))

    def Button_Gray_Clicked(self):# 灰度化
        # 如果没有捕获图片,则不执行操作
        if not hasattr(self, "captured"):
            return
        self.cpatured = cv2.cvtColor(self.captured, cv2.COLOR_RGB2GRAY)
        rows, columns = self.cpatured.shape
        bytesPerLine = columns
        # 灰度图是单通道,所以需要用Format_Indexed8
        QImg = QImage(self.cpatured.data, columns, rows, bytesPerLine, QImage.Format_Indexed8)
        self.label_Result.setPixmap(QPixmap.fromImage(QImg).scaled(
            self.label_Result.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))

    def Button_Threshold_Clicked(self):# Otsu自动阈值分割
        if not hasattr(self, "captured"):
            return

        _, self.cpatured = cv2.threshold(self.cpatured, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
        rows, columns = self.cpatured.shape
        bytesPerLine = columns
        # 阈值分割图也是单通道,也需要用Format_Indexed8
        QImg = QImage(self.cpatured.data, columns, rows, bytesPerLine, QImage.Format_Indexed8)
        self.label_Result.setPixmap(QPixmap.fromImage(QImg).scaled(
            self.label_Result.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))

    @QtCore.pyqtSlot()
    def _queryFrame(self):   #循环捕获图片
        ret, self.frame = self.camera.read()
        img_rows, img_cols, channels = self.frame.shape
        bytesPerLine = channels * img_cols

        cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB, self.frame)
        QImg = QImage(self.frame.data, img_cols, img_rows, bytesPerLine, QImage.Format_RGB888)
        self.label_Camera.setPixmap(QPixmap.fromImage(QImg).scaled(self.label_Camera.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = PyQtMainEntry()
    window.show()
    sys.exit(app.exec_())

2.最终界面
在这里插入图片描述


总结

代码来源墨麟非攻博客,略作修改。

  • 16
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: Python3是一种编程语言,它提供了很多库和框架可以用于各种应用开发。PyQt5Python3的一个GUI(图形用户界面)库,它允许我们创建各种图形界面应用程序。PyCharm是一个Python集成开发环境(IDE),它提供了丰富的功能和工具,可以方便地进行Python编程和应用程序开发。 在Python3中,我们可以使用PyQt5库来访问和控制摄像头。通过使用PyQt5的QCamera和QCameraViewfinder类,我们可以访问计算机上已连接的摄像头设备,并在应用程序中显示摄像头视频流。这样我们就能够在应用程序中捕捉摄像头的图像,并进行进一步的处理和分析。 PyCharm是一个非常流行的Python开发工具,它提供了许多有用的功能来帮助我们编写、调试和测试Python代码。在PyCharm中,我们可以直接编写Python代码,并使用其强大的代码编辑器和自动补全功能来提高编码效率。同时,PyCharm还提供了集成的调试器,可以方便地调试和跟踪代码的执行过程。 因此,如果我们想在Python3中使用PyQt5库来访问和控制摄像头,并且希望使用一个强大的开发工具来编写和调试代码,我们可以选择使用PyCharm作为我们的开发环境。PyCharm提供了直观的界面和丰富的功能,可以让我们更轻松地编写和调试基于PyQt5摄像头应用程序。 ### 回答2: Python3是一种高级编程语言,PyQt5是用于创建图形界面应用程序的Python库,PyCharm是一种集成开发环境(IDE)。摄像头通常是指用于捕捉图像或视频的设备。 在Python中使用摄像头,可以使用OpenCV库来实现。OpenCV是一个开源计算机视觉库,可用于处理图像和视频。 要在PyQt5中使用摄像头,可以通过使用QCamera类来获取和控制摄像头。您可以将QCamera对象与QCameraViewfinder或QGraphicsView一起使用,以便在应用程序中显示摄像头捕捉的图像。 对于IDE,PyCharm是一种流行的Python开发环境,具有代码编辑器、调试器、版本控制等功能。PyCharm提供了丰富的功能和工具,使Python开发更加高效和便捷。 要在PyCharm中使用Python3和PyQt5以及摄像头,您可以首先安装Python3和PyQt5库。然后,您可以设置项目,并使用PyCharm提供的编辑器编写代码。在代码中,您可以导入所需的库和模块,以及使用适当的代码来处理摄像头和图像。 总而言之,您可以使用Python3编写具有PyQt5界面的应用程序,并在PyCharm中进行开发和调试。通过使用OpenCV库,您还可以使用摄像头捕捉图像和视频。 ### 回答3: Python3是一种高级编程语言,广泛应用于各个领域的软件开发和数据分析。PyQt5是一个Python模块,用于创建交互式和可视化的桌面应用程序。PyCharm是一种以Python为主要语言的集成开发环境(IDE),它提供了许多方便的工具和功能来帮助开发者更高效地编写和调试代码。 在Python3中,我们可以使用PyQt5来编写应用程序,包括调用摄像头进行图像采集和处理。通过调用PyQt5中的相机模块,我们可以访问计算机上的摄像头设备,并获取实时的图像数据。使用这些图像数据,我们可以进行各种图像处理操作,如图像增强、图像过滤、目标跟踪等。 为了更好地开发和调试Python应用程序,我们可以使用PyCharm作为开发工具。PyCharm提供了代码编辑器、调试器、版本控制集成等功能,可以提高开发效率和代码质量。在PyCharm中,我们可以轻松设置Python解释器,并导入所需的库和模块,以便使用PyQt5进行摄像头编程。 总结来说,Python3、PyQt5和PyCharm可以一起使用来实现摄像头相关的应用程序。Python3提供了强大的编程能力,PyQt5提供了访问和处理摄像头图像的功能,而PyCharm提供了开发工具和环境,使开发者可以更轻松地进行开发和调试工作。通过这些工具和技术,我们可以实现各种摄像头应用,如视频监控系统、人脸识别系统等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

粒子白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值