OV2640 摄像头实战:拍照、视频流与 AI 视觉

📅 2026-05-20 · 📂 硬件编程 · ⏱ 阅读约 5 分钟

📺 B站推荐视频:Python+ESP32-CAM 摄像头 拍照 录像

概述

给 ESP32 装上眼睛。OV2640 是 ESP32-CAM 标配的 200 万像素摄像头,支持 JPEG 压缩输出。通过 WiFi 把视频流推送到手机浏览器,即可实现远程监控、智能门铃、AI 物体识别。

物料清单

物料型号/参数参考价格
ESP32-CAM 开发板AI-Thinker ESP32-CAM(含 OV2640)~30元
USB-TTL 烧录器CH340G / CP2102~8元
MicroSD 卡(可选)4GB+ Class10~15元
5V 电源MicroUSB 5V 2A(电流不够会花屏)~10元

接线与烧录

🔌 烧录接线
  USB-TTL      ESP32-CAM
  5V     ────  5V
  GND    ────  GND
  TX     ────  U0R
  RX     ────  U0T
  —      ────  IO0→GND (烧录时短接, 烧完断开)
💡 烧录步骤
1. IO0 接 GND → 2. 上电 → 3. 点击 Upload → 4. 完成后拔掉 IO0-GND → 5. 按 RST 重启

基础代码:拍照保存到 SD 卡

// 初始化摄像头 + 拍照保存 #include "esp_camera.h" #include "SD_MMC.h" camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.pin_d0 = 5; // AI-Thinker 引脚配置(略) config.frame_size = FRAMESIZE_SVGA; // 800x600 config.pixel_format = PIXFORMAT_JPEG; config.jpeg_quality = 12; // 0-63, 越小越好 esp_camera_init(&config); SD_MMC.begin(); camera_fb_t *fb = esp_camera_fb_get(); File file = SD_MMC.open("/photo.jpg", FILE_WRITE); file.write(fb->buf, fb->len); file.close(); esp_camera_fb_return(fb);

进阶:WiFi 视频流推送到浏览器

// 核心:WebServer 返回 JPEG 帧 #include <WebServer.h> WebServer server(80); void handleJPEG() { camera_fb_t *fb = esp_camera_fb_get(); server.send_P(200, "image/jpeg", (const char*)fb->buf, fb->len); esp_camera_fb_return(fb); } server.on("/jpeg", handleJPEG); server.on("/", []() { server.send(200, "text/html", "<img src='/jpeg' style='width:100%'/>"); }); server.begin();

手机访问 http://ESP32_IP 即可看到实时画面,帧率约 5-10fps。

实战场景一:智能门铃

场景:有人按门铃时自动拍照并上传到手机。物料:ESP32-CAM(30元)+ 按钮 + 蜂鸣器(5元)。应用:结合之前 Day7 的 HTTP Client 把照片 POST 到服务器,或通过 BLE 发送通知到手机 App。

实战场景二:AI 物体识别

场景:识别面前是什么物体(人、猫、车等)。应用:ESP32-CAM 拍照后通过 WiFi 上传到云端 AI 服务(百度AI的EasyDL或Edge Impulse),返回结果显示在 TFT 屏幕上(Day19)。进阶:ESP32-S3 带神经网络加速器,可本地运行轻量级 TensorFlow Lite 模型。

常见问题

⚠️ 烧录失败 — 确认 IO0 接 GND,先按住 RST 再松开。
⚠️ 画面花屏/条纹 — 供电不足!必须用 5V 2A 独立电源,不要从烧录器的 3.3V 取电。
⚠️ 视频流卡顿 — 降低分辨率到 FRAMESIZE_QVGA(320×240),jpeg_quality 调到 20-30。