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

news/2024/7/8 2:20:30 标签: 计算机视觉, opencv, ui

本实验结合了之前写过的两篇文章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()

http://www.niftyadmin.cn/n/5536160.html

相关文章

常用的Linux系统命令

常用的Linux系统命令 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一些常用的Linux系统命令,这些命令对于系统管理员、开发人员和普…

Android-卷积神经网络(Convolutional Neural Network, CNN)

一个复杂且在Android开发中常见的算法是图像处理中的卷积神经网络(Convolutional Neural Network, CNN)。CNN被广泛用于图像识别、物体检测和图像分割等任务,其复杂性在于需要处理大量的图像数据、复杂的神经网络结构和高效的计算。 1. 卷积操作(Convolution) 数学原理:…

高考志愿填报,选热门专业还是选自己喜欢的专业

对于每一个结束高考的学生来说,都要面临选专业这个严峻的挑战。选专业可以说是妥妥的大工程,因为这关系到接下来的几年要学什么内容,关键是未来的几十年要从事什么样的工作。 所以在谈及选专业这个问题的时候,每个人的内心都有些…

2.5 C#视觉程序开发实例1----设计一个IO_Manager

2.5 C#视觉程序开发实例1----设计一个IO_Manager 第一步目标: 1 实现获取IO触发信号Trig0 2 能够实现程序切换 3 图像处理后能够输出一个脉冲 1 IO 引脚定义 1.1 输入信号定义 1.2 输出信号定义 2 IO时序图 2.1 触发时序 2.2 切换程序时序图 3 IO_Manager.cs …

如何保障云计算健康发展

随着云计算技术的日益成熟,云原生技术凭借其“生于云、长于云”的核心理念,已然成为未来十年云计算发展的关键驱动力。这项技术不仅有效应对了传统云实践中应用升级滞后、架构繁重、迭代效率低下等挑战,更为业务创新铺设了坚实的基石。云原生…

Python缓存利器:cachetools库详解

Python缓存利器:cachetools库详解 1. cachetools简介2. 安装3. 基本概念3.1 LRU Cache (Least Recently Used)3.2 TTL Cache (Time-To-Live)3.3 LFU Cache (Least Frequently Used) 4. 使用示例4.1 使用LRU Cache4.2 使用TTL Cache4.3 使用LFU Cache4.4 缓存装饰器 5. 进阶用法…

JavaScript将参数传递给事件处理程序

本篇文件我们将实现导航栏中,选中时候,会将您选中的进行高亮显示; ● 首先我们来获取我们想要的HTML元素 const nav document.querySelector(.nav);● 接着我们来写选中的高亮显示 nav.addEventListener(mouseover, function (e) { //鼠…

5、Redis 缓存设计相关知识点

1. 多级缓存架构 多级缓存架构是一种通过在应用层和数据库层之间添加多个缓存层来提高系统性能和可用性的架构设计。这种设计能够有效减少数据库负载,并提高数据访问速度。常见的多级缓存包括本地缓存、分布式缓存和数据库缓存。 本地缓存:本地缓存位于应用服务器本地,响应…