在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头,实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点(AP)工作模式–Arduino程序,当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址,也是一样的换掉网址即可。话不多说,上程序效果。请添加图片描述
我是添加了两个按钮,通过点击“打开视频”按钮,可以开始捕获和显示视频流;点击“关闭视频”按钮,可以停止视频流并清除画布内容。
程序如下:

import cv2
import tkinter as tk
from tkinter import *
from PIL import Image, ImageTk  # 图像控件

# 创建视频捕获对象,初始时 cap 为 None,表示摄像头关闭。
cap = None 

# 界面画布更新图像
def tkImage():
    global cap
    if cap is None:
        return None
    ref, frame = cap.read()
    if not ref:
        print("Failed to capture frame")
        return None
    frame = cv2.flip(frame, 1)  # 摄像头翻转
    cvimage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    pilImage = Image.fromarray(cvimage)
    pilImage = pilImage.resize((image_width, image_height), Image.LANCZOS)
    tkImage = ImageTk.PhotoImage(image=pilImage)
    return tkImage

def start_video():
    global cap
    if cap is None or not cap.isOpened():  #检查 cap 是否为 None 或未打开。如果关闭,则初始化 cap 并打开摄像头。
        cap = cv2.VideoCapture("http://192.168.4.1:81/stream")#这个是ESP32S3摄像头,我才用的是摄像头开热点的模式,这个网址可以更改,看摄像头的URL决定
    update_frame() #启动 update_frame 函数以更新视频帧。

def stop_video():
    global cap
    if cap is not None and cap.isOpened():
        cap.release() #如果打开,则释放摄像头并将 cap 置为 None。
    canvas.delete("all")  # 清除画布内容

def update_frame():
    global image_container, cap
    if cap is None or not cap.isOpened():
        return
    pic = tkImage()
    if pic:
        canvas.create_image(0, 0, anchor='nw', image=pic)
        image_container = pic  # 保存引用
    else:
        print("No image to display")
    top.after(10, update_frame)  # 每10毫秒更新一次图像

top = tk.Tk()
top.title('视频窗口')
top.geometry('900x600')
image_width = 600
image_height = 500
canvas = Canvas(top, bg='white', width=image_width, height=image_height)  # 绘制画布
Label(top, text='这是wifi摄像头画面!', font=("黑体", 14), width=20, height=1).place(x=400, y=20, anchor='nw')
Button(top, text="打开视频", command=start_video).place(x=50, y=20)
Button(top, text="关闭视频", command=stop_video).place(x=50, y=60)
canvas.place(x=150, y=50)

# 保存图像对象,以防止被垃圾回收
image_container = None

top.mainloop()

# 释放摄像头
if cap is not None:
    cap.release()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/768330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何快速掌握一门编程语言

学习一门新的编程语言可能是一个具有挑战性的过程,但通过一些系统的方法,可以大大加快这个过程。 目录 第一步:通过书籍和视频课程掌握基本语法1. **学习编程语言的基础知识**2. **掌握字符串处理**3. **掌握正则表达式和解析器**4. **掌握面…

停车场车牌识别计费系统,用Python如何实现?

关注星标,每天学习Python新技能 前段时间练习过的一个小项目,今天再看看,记录一下~ 项目结构 说明: datefile文件夹:保存车辆信息表的xlsx文件 file文件夹:保存图片文件夹。ic_launcher.jpg是窗体的右上角…

什么是 URL ?

统一资源定位符(URL)是一个字符串,它指定了一个资源在互联网上的位置以及如何访问它。URL 是由几部分组成的,每部分都有其特定的作用: 协议/方案:这是 URL 的开头部分,表明了用于访问资源的协议…

stm32F4库函数c++和C混合编程笔记20240626

1、有时候需要用到c的一些特性,封装,类等等。 2、研究一下如何更改之前c工程的内容,实现混合编程。 操作 1、keil设置 2、要重新建立一个main文件,后缀名是cpp,cpp才能调用cpp. 后面如果要用到c特性的,需要…

python sklearn机械学习-数据预处理

🌈所属专栏:【机械学习】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您…

C++: 左值引用和右值引用

目录 概念: 理解: 左值引用,右值引用 左值引用能否给右值取别名? 右值引用能否给左值取别名? 引用的意义是什么? 左值和右值对自定义类型有什么区别吗? move的妙用! 没有优化…

统计信号处理基础 习题解答11-13

题目 如果是一个2x1的随机矢量,具有PDF 证明的PDF是一个随机变量。提可以因式分解成,其中是一个在4.5节描述的白化变换。 解答 首先: 因此,存在: 也就是是Hermitian矩阵。详细的性质可以参考: https://z…

Git使用[推送大于100M的文件后解救办法]

推送大于100M的文件后解救办法 本文摘录于:https://blog.csdn.net/u012150602/article/details/122687435只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人! 当有文件大于100M的时候在提交的时候没有问题,但是在push的似乎就不行…

电影院售票管理系统(小白)大佬求解

最近在写一个关于电影院售票管理系统的sm项目,但是在买票的环节出现了问题及点击选座购票,没有数据渲染出来,我不知道什么情况,所以问问。有没有大佬可以帮我解决这个问题?下面是我的。控制层,服务层&#…

学校考场电子钟除了报时,还能做什么?-讯鹏时钟

在学校考场中,电子钟的存在似乎已经司空见惯,大多数人仅仅将其视为报时的工具。然而,学校考场电子钟的作用远不止于此,它具备众多优势和丰富的功能。 学校考场电子钟能够提供精准的时间参考,这是其最基础也是最关键的功…

Qt:5.QWidget属性介绍(Enabled属性-控件可用性设置、geometry属性-控件位置/大小设置)

目录 一、 QWidget属性的介绍: 二、Enabled属性-控件可用性设置: 2.1Enabled属性的介绍: 2.2获取控件当前可用状态的api——isEnabled(): 2.3设置控件当前的可用状态的api—— setEnabled() : 2.4 实例&#xff…

第二十一章 网络编程

​ 一、网络的相关概念 1. 网络通信 (1)网络通信:将 数据 通过网络从一台设备传输到另一台设备 (2)java.net 包下提供了一系列的类或接口,完成网络通信 2. 网络 概念:两台或多台设备通过一定…

VideoLLaMA 2:多模态视频理解新突破,音频理解能力再升级,挑战 GPT-4V

前言 近年来,人工智能技术飞速发展,尤其是大模型的出现,为视频理解和生成领域带来了前所未有的机遇。然而,现有的视频大模型(Video-LLM)在处理视频中复杂的时空信息和音频信息方面仍存在不足,例…

基于矩阵分解算法的评分预测实现---信息检索课设以及所涉及的深度学习原理

一、实验环境 Windows,Python 3 Python作为主要编程语言,使用Python的Pandas、NumPy、Matplotlib等库 二、实验内容 主要任务 查阅相关资料,了解矩阵分解算法的基本概念、应用场景及其难点。重点了解SVD(Singular Value Decomposition,奇异值分解)系列方法。掌握Pyth…

Python特征工程 — 1.4 特征归一化方法详解

目录 1 Min-Max归一化 方法1:自定义的Min-Max归一化封装函数 方法2: scikit-learn库中的MinMaxScaler 2 Z-score归一化 方法1:自定义的Z-score归一化封装函数 方法2: scikit-learn库中的StandardScaler 3 最大值归一化 4 L…

嵌入式c语言3——自定义数据类型

结构体struct,共用体union 结构体中定义变量,首尾地址相连 对于union,其包含变量对起始地址相同 由于其起始地址相同,则改变其中某一变量值时有可能使得另一个变量值发生改变 enum 枚举,可以用来定义一堆整形常量构成…

AzureDataFactory Dataverse connector自动处理了分页问题(单次查询上限5000条的限制)

众所周知,在用fetch执行D365的查询时,单次的查询是5000条,如果超过5000条则需要自己处理分页,添加额外的处理逻辑,但在ADF中,Dataverse connector已经自动处理了分页,我们可以很简单的做个POC. …

昇思25天学习打卡营第05天 | 数据变换 Transforms

昇思25天学习打卡营第05天 | 数据变换 Transforms 文章目录 昇思25天学习打卡营第05天 | 数据变换 TransformsCommon TransformsCompose Vision TransformsText TransformPythonTokenizerLookup Lambda Transforms数据处理模式Pipeline模式Eager模式 总结打卡 通常情况下的原始…

巴图制自动化Profinet协议转Modbus协议模块连接PLC和电表通信

1、免编写Modbus轮询程序实现PLC与电表通信的方法 在智能化时代,工业自动控制中的PLC和电表之间的通信是一个常见的需求。传统上,为了使PLC与电表通信,通常需要编写Modbus查询程序来读取和控制数据。然而,使用 巴图制自动化Prof…

(十二)纹理和采样

纹理 在绘制三角形的过程中,将图片贴到三角形上进行显示的过程,就是纹理贴图的过程 uv坐标 如果如果图片尺寸和实际贴图尺寸不一致,就会导致像素不够用了的问题 纹理与采样 纹理对象(Texture):在GPU端,用来以一…