程序代码篇---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 cv2

def display_esp32_cam_stream(url):
    # 创建VideoCapture对象
    cap = cv2.VideoCapture(url)

    # 检查摄像头是否成功打开
    if not cap.isOpened():
        print("无法连接到ESP32 - S2 - cam视频流")
        return

    print("成功连接到视频流,按 '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的视频流URL
    esp32_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 deque

class VideoStream:
    def __init__(self, url):
        self.url = url
        self.cap = cv2.VideoCapture(url)
        self.stopped = False
        self.frames = deque(maxlen=1)
        self.thread = threading.Thread(target=self.update, args=())
        self.thread.daemon = True

    def start(self):
        self.thread.start()
        return self

    def update(self):
        while not self.stopped:
            if not self.cap.isOpened():
                print("重新连接到视频流...")
                self.cap = cv2.VideoCapture(self.url)
                continue

            ret, 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 None

    def stop(self):
        self.stopped = True
        self.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()
        return

    print("成功连接到视频流,按 '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的视频流URL
    esp32_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进一步代码优化

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


你可能感兴趣的:(程序代码篇,图像处理篇,上位机操作篇,python,开发语言,ESP32,图像处理,url读取,oepncv)