PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

这篇具有很好参考价值的文章主要介绍了PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1--前言

2--基于Qt Designer设计ui文件

3--视频的编解码操作

4--完整代码

5--结果展示

6--存在的问题

7--参考


1--前言

① 创建两个线程,主线程为ui线程,子线程用于读取摄像头视频,将处理后的图像帧数据(处理操作可以人为添加)返回到主线程进行可视化;

② 子线程向主线程传递视频帧数据集涉及图像的编码操作,主线程接收子线程的数据时涉及图像的解码操作;

2--基于Qt Designer设计ui文件

PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

3--视频的编解码操作

① 编码操作:

# 图像编码函数
def Encoder(self, img):
    retval, buffer = cv2.imencode('.jpg', img)
    jpg_as_bytes = base64.b64encode(buffer)
    jpg_as_str = jpg_as_bytes.decode('ascii')
    json_object = json.dumps({'img_str': jpg_as_str})
    return json_object

注:img 为 opencv 读取图像的格式(默认uint8, BGR);  编码后的数据 json_object 可以直接通过signal.emit(json_object) 进行发送。

② 解码操作:

# 图片解码函数
def Decoder(self, img_json):
    jpg_as_str = json.loads(img_json)['img_str']
    jpg_as_bytes = jpg_as_str.encode('ascii')
    jpg_original = base64.b64decode(jpg_as_bytes)
    jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
    img = cv2.imdecode(jpg_as_np, flags=1)
    return img

注:输入的 img_json 与编码函数生成的 json_object 格式相同;解码生成的 img 可以通过cv2.imshow("window_name", img) cv2.waitKey(0)进行显示。

4--完整代码

import sys
import time

import json
import cv2
import base64
import numpy as np

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5 import uic

# 子线程1:打开摄像头,返回当前帧图像到主线程
class Open_Cam(QThread):
    Open_Cam_signal = pyqtSignal(str)  # 接受来自主线程的信号

    def __init__(self, main_signal):
        super().__init__()
        # 信号绑定槽函数
        self.Open_Cam_signal.connect(self.Open_Cam)
        self.opencam_complete_signal = main_signal  # 返回主线程的信号

    def Open_Cam(self, Cam):
        # 将json字符串转换
        Cam_index = json.loads(Cam)  # 0
        cap = cv2.VideoCapture(Cam_index)
        fps = cap.get(cv2.CAP_PROP_FPS)
        while True:
            ret, self.frame = cap.read()
            '''
            这里你可以添加对图像进行处理的操作
            '''
            json_object = self.Encoder(self.frame)  # 对图片进行编码
            self.opencam_complete_signal.emit(json_object)  # 发送编码到主线程
            cv2.waitKey(int((1 / fps) * 1000))

    # 图像编码函数
    def Encoder(self, img):
        retval, buffer = cv2.imencode('.jpg', img)
        jpg_as_bytes = base64.b64encode(buffer)
        jpg_as_str = jpg_as_bytes.decode('ascii')
        json_object = json.dumps({'img_str': jpg_as_str})
        return json_object

    def run(self):
        while True:  # 让子线程一直运行,等待主线程(ui线程)下发的任务
            print("子线程1正在等待执行....")
            time.sleep(2)

class MyWindow(QWidget):
    opencam_complete_signal = pyqtSignal(str)  # 子线程返回摄像头图像到主线程的信号

    def __init__(self):
        super().__init__()
        self.init_ui()
        self.cam_idx = 0

    def init_ui(self):
        self.ui = uic.loadUi("./Cam.ui")  # 加载由Qt Designer设计的ui文件

        # 加载控件
        self.open_cam_btn = self.ui.pushButton
        self.cam_view = self.ui.graphicsView

        # 绑定槽函数
        self.open_cam_btn.clicked.connect(self.open_cam)
        self.opencam_complete_signal.connect(self.view_cam)

        self.Opencam_Thread = Open_Cam(self.opencam_complete_signal)  # 子线程1
        self.Opencam_Thread.start()  # 子线程1运行,等待下发任务

    def open_cam(self):  # 给子线程1发送打开摄像头的信号
        self.Opencam_Thread.Open_Cam_signal.emit(json.dumps(self.cam_idx))

    def view_cam(self, img_json):  # 接受来自子线程1返回的摄像头数据
        self.img_json = img_json
        img = self.Decoder(self.img_json)
        frame = QImage(img, img.shape[1], img.shape[0], img.strides[0], QImage.Format_RGB888).rgbSwapped()
        pix = QPixmap.fromImage(frame)
        item = QGraphicsPixmapItem(pix)  # 创建像素图元
        scene = QGraphicsScene()  # 创建场景
        scene.addItem(item)
        self.cam_view.setScene(scene)  # 将场景添加至视图
        self.cam_view.fitInView(item)  # 自适应大小

    # 图片解码函数
    def Decoder(self, img_json):
        jpg_as_str = json.loads(img_json)['img_str']
        jpg_as_bytes = jpg_as_str.encode('ascii')
        jpg_original = base64.b64decode(jpg_as_bytes)
        jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
        img = cv2.imdecode(jpg_as_np, flags=1)
        return img

if __name__ == '__main__':
    app = QApplication(sys.argv)  # 创建对象

    w = MyWindow()
    # 展示窗口
    w.ui.show()

    # 程序进行循环等待状态
    app.exec_()

5--结果展示

PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

6--存在的问题

上述代码存在当关闭ui窗口时,子线程不会自动结束的问题,后续将补充如何解决这个问题的方案。

1130补充:上述问题的原因在于我把读视频的while true循环写在了run函数外,为了避免这个问题可以采用定时器读取视频流的方法,可以参考博主的一个学习笔记。

7--参考

使用python将opencv中读取的numpy矩阵json序列化文章来源地址https://www.toymoban.com/news/detail-408449.html

到了这里,关于PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Pyqt5+Opencv实现摄像头图像的实时读取并显示

    QTimer在界面中不可见,在UI设计器中也找不到它,只能通过纯代码实现,主要作用是定时特定的时间。 想要掌握QTimer只需掌握setInterval(设置定时时间,单位ms)、start(启动定时器),和定时时间到时所发出的信号timeout()即可。程序设计的思路: 1.先设定定时周期 2.绑定timeout()信号

    2024年02月04日
    浏览(55)
  • 小白教程:PyQt5点击按钮,调用笔记本电脑摄像头将实时画面显示在label控件上,并且使用UI代码和逻辑代码分开的方式

    能力一般,水平有限,真心欢迎批评指正!以后会不断完善修改,如果对你有帮助欢迎点赞收藏! 小白教程,当我们掌握了一点点的Qt Designer的技能,得意于能够在界面上作画的时候,怎么编写其中的逻辑关系是我们进一步想要了解的,下面介绍了 点击按钮--调用笔记本电脑

    2024年01月17日
    浏览(92)
  • PyQt界面里如何加载本地视频以及调用摄像头实时检测(小白入门必看)

    目录 1.PyQt介绍 2.代码实现  2.1实时调用摄像头 2.2 使用YOLOv5推理 2.3 代码中用到的主要函数  PyQt是一个用于创建桌面应用程序的Python绑定库,它基于Qt框架。Qt是一个跨平台的C++应用程序开发框架,提供了丰富的图形界面、网络通信、数据库操作等功能。PyQt通过将Qt框架与Py

    2024年02月03日
    浏览(66)
  • STM32连接OV2640摄像头串口方式在PyQt5界面上展示视频界面 以及使用MQTT方式进行展示

    STM32连接OV2640 视频源接入到PyQt5界面中 作为AI模型的输入,视频流是非常重要的。在本文中,我们将介绍如何将STM32连接到OV2640摄像头,并将视频流接入到PyQt5界面中。 硬件连接 首先,我们需要将OV2640摄像头连接到STM32上。我们可以使用以下连接方式: OV2640 | STM32 ------|------

    2024年02月06日
    浏览(56)
  • PyQt5摄像头的使用--摄像头操作概述及使用摄像头拍照

    1、功能概述 PyQt5多媒体模块为摄像头操作提供了几个类,可以用于获取摄像头设备信息,通过摄像头进行拍照和录像。 Qt多媒体模块的功能实现是依赖于平台的。在Windows平台上,Qt多媒体模块依赖于两个插件:一个是使用Microsoft DirectShow API的插件,DirectShow在Windows 98引入,在

    2024年02月05日
    浏览(50)
  • Pyqt5打开电脑摄像头进行拍照

    目录 1、设计UI界面 2、设计逻辑代码,建立连接显示窗口 3、结果 1、设计UI界面 将ui界面转为py文件后获得的逻辑代码为:(文件名为  Camera.py ) 2、设计逻辑代码,建立连接显示窗口 逻辑代码如下:(文件名为 Camera_main.py ) 3、结果 参考:暂未成功人士

    2024年02月12日
    浏览(47)
  • 使用PYQT5打开电脑摄像头并进行拍照

    目录 1 UI界面的布局 2 UI界面布局对应的代码 3 打开电脑摄像头等功能的完整代码 4 一些代码函数和优化界面代码 5 最终效果 下图是简单设计的一个UI控制的输出可视化界面。       其中, 摄像头图片显示 使用的是左边功能的 label 类、 打开摄像头拍照关闭摄像头导出图片

    2023年04月21日
    浏览(42)
  • 【学习笔记】Yolov5调用手机摄像头实时检测(环境配置+实现步骤)

    我们需要首先从GitHub获取到yolov5的源码,直达链接如下: https://github.com/ultralytics/yolov5 打开后按照如下步骤下载源码压缩包即可 权重文件下载地址:https://download.csdn.net/download/liujiahao123987/87400892 注:我用的iOS,安卓版本没有\\\"Lite\\\" 需要的就是这个局域网,每个人的都不一样 需

    2023年04月25日
    浏览(50)
  • [Python] pyqt6+opencv实现摄像头图像的实时读取并显示(完整源代码)

    本文将会介绍如何通过opencv来实时捕获摄像头的图像,并通过pyqt6进行图像视频呈现。 1. 通过opencv的VideoCapture类读取摄像头的每一帧图像,通过pyqt6的QLabel来显示图像 2. 根据获取的图像的宽和高大小以及QLabel的大小来动态调整最后输出的图像的宽和高 3. 调整窗体大小,动态调

    2024年01月24日
    浏览(68)
  • web接入大华摄像头实时视频

    目录 一、FFmpeg下载及配置​​​​ 二、nginx下载及配置 三、摄像rtsp取流 四、ffmpeg推流 五、html前端工作 地址:Download FFmpeg    下载并解压FFmpeg文件夹,配置环境变量:在“Path”变量原有变量值内容上加上d:ffmpegbin,验证:ffmpeg -version 出现版本号则成功。 这个我之前有,

    2023年04月20日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包