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

程序代码篇---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进一步代码优化

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


http://www.xdnf.cn/news/7809.html

相关文章:

  • ROS2学习(8)------ROS2 服务说明
  • ubuntu 搭建FTP服务,接收部标机历史音视频上报服务器
  • 线性表数据结构-堆栈
  • 网络安全之APP渗透测试总结
  • Vue3 组件之间传值
  • React深度解析:Hooks体系与Redux Toolkit现代状态管理实践
  • linux 学习之位图(bitmap)数据结构
  • 宝塔安装的 MySQL 无法连接的情况及解决方案
  • StepX-Edit:一个通用图像编辑框架——论文阅读笔记
  • 计算机网络相关面试题
  • 安全可控的AI底座:灯塔大模型应用开发平台全面实现国产信创兼容适配认证
  • 数据被泄露了怎么办?
  • 视觉生成新突破!仅0.5B参数,SimpleAR解锁预训练、SFT、RL全能模式
  • 【MC】红石比较器
  • Spring Boot 项目中 Redis 存储 Session 对象序列化处理
  • 面向未来,遨游推出5G-A智能防爆对讲机等系列终端
  • Qt功能区:Ribbon控件
  • BEVDet
  • opencv_version_win32
  • Leetcode-2 最小偶倍数
  • pikachu靶场 暴力破解
  • 服务器安装xfce桌面环境并通过浏览器操控
  • SpringBoot外部化配置
  • NIFI的处理器:ExecuteGroovyScript 2.4.0
  • 第14天-Matplotlib实现数据可视化
  • ollama使用gpu运行大模型
  • Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用
  • Java 定时任务中Cron 表达式与固定频率调度的区别及使用场景
  • 唯创安全优化纸业车间安全环境:门口盲区预警报警器的应用与成效
  • STL中的Vector(顺序表)