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。