ESP32-S3-GC0308摄像头结果存储

一、先查找官方组件管理器

GC0308

支持GC0308
image

基于上一次的工程,摄像头启动+初始化完成

1、查找bmp或者jpeg部分

这个是结构体部分存储jpeg的buffer的变量,置0为使用默认大小而不是为0
image

2、关于模式

- JPEG HTTP Capture模式:

相当于”拍照模式”。发送请求之后,ESP32拍摄返回一张.jpg图片

- JPEG HTTP Stream模式:

相当于“监控视频流模式”,浏览器不断接收图片而形成动态适配

- BMP HTTP Capture模式:

相当于“无损拍照模式”,将摄像头数据不进行压缩的BMP格式回传电脑

3、配置Stream的代码

这里想配置视频流模式,所以先把官方的JPEG Stream代码放到主程序之前,导入头文件

4、查找插件目录下案例wifi

Wifi的API指南(点击)
放置之后需要去查找Wifi设置启动文档,官方解释在示例路径下:
image

image
image

  1. 头文件
    image

  2. BTT(还不知道是什么)
    image

  3. 事件回调
    日志打印获取到的IP地址,去浏览器输入
    image

  4. wifi初始化
    image

搞完之后报错:
需要在Cmkaelsit.txt中require它
image
即
image
再次报错,漏下了
image
image
image
RGB565
image
扩展芯片的IIC端口和摄像头同时配置了GPIO1和2,则IIC设置参数sccb-ng为0,使用已经创建好的总线
image

烧录测试:
image

5、WebServer文件

image

image
image

image

image
原始(眼睛不舒服,网页放大了,原始网页窗口是750x580上下(网页而不是摄像头设置尺寸,经过默认浏览器渲染机制)

水平镜像

image
image

image

鼠标侧为右手,即右边部分

image

拓展:如果视频流可以传输到电脑端,那直接在电脑(服务器)存储呢?

1)OpenCV 读取 MJPEG 视频流

参考链接:有广告 慎入
image

2)解析HTTP流方法(主要先跑通再换好方案)

image

3)其余ways(截图来的)

image

附件-视频流结果存储到电脑(改stream地址)

存储效果,如果是在esp端需要用到tf卡
image

点击查看代码
import cv2
import requests
import numpy as np
import mediapipe as mp
import os
from datetime import datetime

# ================= 1. 初始化文件夹和录像机 =================
today = datetime.now().strftime("%Y-%m-%d")
save_dir = f"monitor_records/{today}"
os.makedirs(save_dir, exist_ok=True)

video_filename = f"{save_dir}/record_{datetime.now().strftime('%H%M%S')}.avi"
# 使用 XVID 编码,生成 10帧/秒,320x240 分辨率的视频
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(video_filename, fourcc, 10.0, (320, 240)) 
print(f"======== 开始录制 ========")
print(f"文件将保存至: {video_filename}")
print(f"按 'q' 键停止录制并保存。")

# ================= 2. 初始化 MediaPipe AI 模型 =================
mp_face_detection = mp.solutions.face_detection
face_detection = mp_face_detection.FaceDetection(model_selection=0, min_detection_confidence=0.5)

# ================= 3. 连接 ESP32 视频流 =================
# !!!如果你改了 IP,请在这里修改 !!!
url = "http://192.168.228.55/stream"
stream = requests.get(url, stream=True)
bytes_data = bytes()

# ================= 4. 主循环:收图 -> AI画框 -> 存视频 =================
for chunk in stream.iter_content(chunk_size=1024):
    bytes_data += chunk
    a = bytes_data.find(b'\xff\xd8')
    b = bytes_data.find(b'\xff\xd9')
    
    if a != -1 and b != -1 and b > a:
        jpg = bytes_data[a:b+2]
        bytes_data = bytes_data[b+2:]
        
        frame = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
        
        if frame is not None:
            # 进行 AI 人脸检测并画框
            rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            results = face_detection.process(rgb_frame)
            
            if results.detections:
                for detection in results.detections:
                    bboxC = detection.location_data.relative_bounding_box
                    ih, iw, _ = frame.shape
                    x, y = int(bboxC.xmin * iw), int(bboxC.ymin * ih)
                    w, h = int(bboxC.width * iw), int(bboxC.height * ih)
                    
                    cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
            
            # 【核心】把画好框的这一帧,写进视频文件!
            out.write(frame) 
            
            # 在屏幕显示
            cv2.imshow("Smart Monitor", frame)
            
        # 按 q 退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

# ================= 5. 退出时清理现场 =================
out.release()
cv2.destroyAllWindows()
print("======== 录制结束,视频已安全保存! ========")

posted on 2026-10-31 23:54  Seeyu^-^  阅读(18)  评论(0)    收藏  举报

导航