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

本实验结合了之前写过的两篇文章Python调用摄像头,实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点(AP)工作模式--Arduino程序,当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址,也是一样的换掉网址即可。话不多说,上程序效果。

我是添加了两个按钮,通过点击"打开视频"按钮,可以开始捕获和显示视频流;点击"关闭视频"按钮,可以停止视频流并清除画布内容。

程序如下:

python 复制代码
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()
相关推荐
zhchyun200825 分钟前
【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(10)
ui·unity·游戏引擎
传奇开心果编程39 分钟前
【Jetpack Compose进阶学与练】第14课:系列收尾复习总结;Compose项目常见坑点汇总;学习路线与后续学习方向
android·学习·ui·kotlin·android jetpack
李航19832 小时前
给自己的图形引擎,配上了AI渲染,做设计真是太方便了
人工智能·python·计算机视觉·ai·ai编程
Zentceh3 小时前
安防监控夜视方案2026:AI全彩+边缘计算+云平台
图像处理·人工智能·科技·计算机视觉·车载系统·无人机·边缘计算
kiros_wang4 小时前
渐变/阴影/滤镜⾼阶⽤法:统⼀项⽬UI、精简冗余组件
ui·harmonyos
YOLO数据集集合5 小时前
风机叶片表面损伤检测数据集 | 风机叶片 表面损伤 污渍检测 无人机巡检 风电运维9119期
运维·人工智能·计算机视觉·目标跟踪·无人机·智慧城市·电力巡检
小蒋观天下6 小时前
行业拆解|两轮车检测AI摄像头的核心技术迭代、产品演进及未来技术发展
大数据·人工智能·安全·计算机视觉·ai大模型
鬼手点金8 小时前
Claude Code示范案例-常用快捷命令
java·服务器·前端·计算机视觉·前向传播
沫璃染墨9 小时前
《Qt从零入门系列(十一):Qt事件机制详解——从QEvent到鼠标、键盘与定时器事件》
c++·qt·ui·硬件工程·交互·个人开发·qt5
兴通物联科技11 小时前
对俄出口诚实标识 2026 时间节点与产线赋码采集技术方案
大数据·服务器·单片机·嵌入式硬件·深度学习·计算机视觉