当前位置: 首页 > news >正文

程序代码篇---Python处理ESP32-S3-cam视频流


文章目录

  • 前言
  • 一、基本获取、显示代码
    • 1.代码说明
      • 1.1功能概述
      • 1.2关键部分
      • 1.3注意要点
  • 二、优化显示代码
    • 1.优化说明
      • 1.1多线程处理
      • 1.2帧处理优化
      • 1.3错误处理增强
      • 1.4显示性能优化
    • 2.额外优化建议
      • 2.1调整 ESP32 - S3 - cam 设置
      • 2.2网络优化
      • 2.3硬件加速
      • 2.4进一步代码优化


前言

使用 Python 获取 ESP32 - S2 - cam 生成在 http 网址上的视频流并显示的解决方案以及提升 ESP32 - S2 - cam 视频流显示性能的方法。


一、基本获取、显示代码

import cv2def display_esp32_cam_stream(url):# 创建VideoCapture对象cap = cv2.VideoCapture(url)# 检查摄像头是否成功打开if not cap.isOpened():print("无法连接到ESP32 - S2 - cam视频流")returnprint("成功连接到视频流,按 'q' 键退出")while True:# 读取视频帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法获取帧,退出")break# 显示帧cv2.imshow('ESP32 - S2 - cam视频流', frame)# 按 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源cap.release()cv2.destroyAllWindows()if __name__ == "__main__":# 请替换为你的ESP32 - S2 - cam的视频流URLesp32_cam_url = "http://your_esp32_cam_ip_address:81/stream"display_esp32_cam_stream(esp32_cam_url) 

1.代码说明

1.1功能概述

功能概述:此脚本借助 OpenCV 库来获取并显示 ESP32 - S2 - cam 的视频流。

1.2关键部分

要使用该脚本,需先安装 OpenCV 库,可通过命令pip install opencv - python进行安装。
你需要把代码中的http://your_esp32_cam_ip_address:81/stream替换成你 ESP32 - S2 - cam 实际的视频流 URL
当脚本运行后,会弹出一个窗口显示视频流,按下键盘上的q键就能退出显示。

1.3注意要点

  1. 要保证 ESP32 - S2 - cam 正常运行,并且网络连接稳定。
  2. 要确认 ESP32 - S2 - cam 的 IP 地址以及视频流端口号(通常是 81)。
  3. 若视频流无法正常显示,你可以尝试检查 ESP32 - S2 - cam 的配置或者网络连接情况。

二、优化显示代码

import cv2
import threading
from collections import dequeclass VideoStream:def __init__(self, url):self.url = urlself.cap = cv2.VideoCapture(url)self.stopped = Falseself.frames = deque(maxlen=1)self.thread = threading.Thread(target=self.update, args=())self.thread.daemon = Truedef start(self):self.thread.start()return selfdef update(self):while not self.stopped:if not self.cap.isOpened():print("重新连接到视频流...")self.cap = cv2.VideoCapture(self.url)continueret, frame = self.cap.read()if ret:# 调整帧大小以提高性能frame = cv2.resize(frame, (640, 480))self.frames.append(frame)def read(self):return self.frames[-1] if self.frames else Nonedef stop(self):self.stopped = Trueself.thread.join()self.cap.release()def display_esp32_cam_stream(url):# 创建视频流对象vs = VideoStream(url).start()# 检查摄像头是否成功打开if not vs.cap.isOpened():print("无法连接到ESP32 - S2 - cam视频流")vs.stop()returnprint("成功连接到视频流,按 'q' 键退出")# 设置窗口属性cv2.namedWindow('ESP32 - S2 - cam视频流', cv2.WINDOW_NORMAL)cv2.resizeWindow('ESP32 - S2 - cam视频流', 640, 480)while True:# 从队列中获取最新帧frame = vs.read()if frame is not None:# 显示帧cv2.imshow('ESP32 - S2 - cam视频流', frame)# 按 'q' 键退出循环,增加响应速度key = cv2.waitKey(1)if key == ord('q'):break# 释放资源vs.stop()cv2.destroyAllWindows()if __name__ == "__main__":# 请替换为你的ESP32 - S2 - cam的视频流URLesp32_cam_url = "http://your_esp32_cam_ip_address:81/stream"display_esp32_cam_stream(esp32_cam_url)    

1.优化说明

1.1多线程处理

采用专门的线程来读取视频帧,防止 I/O 操作阻塞主线程
运用双端队列(deque)缓存最新的一帧,保证显示的是实时画面。

1.2帧处理优化

自动调整帧大小为 640×480,减轻 CPU 的处理负担。
只保留最新的一帧,避免队列中积压过多帧而导致延迟

1.3错误处理增强

增添了自动重连机制,当视频流中断时能够尝试重新连接
优化了资源释放流程,防止出现内存泄漏的情况。

1.4显示性能优化

预先设置窗口大小,减少动态调整带来的开销
优化了按键响应逻辑,提升用户体验

2.额外优化建议

2.1调整 ESP32 - S3 - cam 设置

分辨率调低(如 320×240),可以降低带宽的需求
**降低帧率(如 10fps),**能减少数据传输量。

2.2网络优化

让 ESP32 和接收设备处于同一个局域网内,减少网络延迟。
优先使用有线网络连接 ESP32,保证网络连接稳定。

2.3硬件加速

要是处理能力不足,可以考虑使用硬件解码(例如 OpenCV 的 GPU 加速)。

2.4进一步代码优化

可以添加丢帧逻辑,在网络状况不佳时保证视频的流畅性。
实现动态帧率调整,根据网络状况自动优化性能。


相关文章:

  • 分布式电源的配电网无功优化
  • 新导游入行规范与职业发展指导
  • 选择合适的Azure数据库监控工具
  • SOPHGO算能科技BM1688内存使用与编解码开发指南
  • 数据库主从集群 + GTID 实现高可用
  • 【android bluetooth 协议分析 02】【bluetooth hal 层详解 3】【高通蓝牙hal主要流程介绍-上】
  • Java SpringBoot 项目中 Redis 存储 Session 具体实现步骤
  • 虚拟机NAT模式获取不到ip
  • ConcurrentHashMap导致的死锁事故
  • 单片机设计_四轴飞行器(STM32)
  • 开源STM32F429汽车仪表盘基于LVGL界面
  • Rust 学习笔记:关于泛型的练习题
  • 打破性能瓶颈:用DBB重参数化模块优化YOLOv8检测头
  • 【Leetcode 每日一题】3356. 零数组变换 II
  • 极大似然估计与机器学习
  • 【图像大模型】深度解析RIFE: 基于中间流估计的实时视频插帧算法
  • 代码随想录算法训练营第60期第四十三天打卡
  • 高级学习算法(神经网络 决策树)
  • 如何用JAVA手写一个Tomcat
  • Web服务器(Tomcat)
  • 网站优化排名推荐/网络站点推广的方法
  • 施工企业资质等级划分/处理器优化软件
  • 网站首页html代码/网络推广企划
  • 淄博做网站公司有哪些/沧州网站运营公司
  • 做男女的那个视频网站/网站制作基本流程
  • 免费综合网站注册申请/seo推广技术