尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于ESP32-CAM的智能门禁系统:从硬件选型到人脸识别全链路实践

基于ESP32-CAM的智能门禁系统:从硬件选型到人脸识别全链路实践 1. 项目缘起从“智能猫眼”到“安全哨站”的升级之路几年前我给家里的老式防盗门装了个智能猫眼用的是一个带摄像头的Wi-Fi模块初衷很简单有人按门铃时手机能收到推送看看门外是谁。这个需求确实解决了但用久了问题也暴露出来。首先是续航内置电池撑不了几天频繁充电很麻烦其次是功能单一除了看人没有其他预警能力最后是可靠性偶尔会断连关键时刻掉链子。我琢磨着能不能自己动手做一个更“硬核”的解决方案它得是插电的保证24小时在线它不能只是个“眼睛”还得是个有分析能力的“大脑”它最好还能联动家里的其他设备形成一个小的安防网络。这就是“ESP32-CAM Smartdoor with Security Station”这个项目的由来。它不是一个简单的门铃替代品而是一个部署在门口的、具备本地智能分析能力的微型安全工作站。核心硬件是ESP32-CAM这块集成了Wi-Fi、蓝牙和摄像头的开发板成本低廉但潜力巨大。通过它我们可以实现人脸识别、运动检测、异常声音监测甚至将警报信息推送到自建的服务器或手机App上形成一个主动防御而非被动查看的安防节点。这个项目适合所有对物联网、嵌入式开发和智能家居安防感兴趣的动手派无论你是想深入学习ESP32的复杂应用还是想切实提升家门口的安全等级都能从中找到乐趣和实用价值。2. 核心硬件选型与电路设计为什么是ESP32-CAM市面上能跑AI、带摄像头的开发板不少比如树莓派加摄像头模块方案更强大但我最终选择了ESP32-CAM这背后有几个关键的权衡。2.1 ESP32-CAM的独特优势与固有局限ESP32-CAM的核心是一颗ESP32-S芯片双核处理器主频高达240MHz内置520KB SRAM和4MB PSRAM部分型号。对于图像处理和人脸识别这类内存消耗大的任务外置的PSRAM至关重要它决定了你能处理多大分辨率的图像以及模型的复杂度。其最大的优势在于极高的集成度和极低的功耗深度睡眠模式下电流可低至10μA以下以及成熟的Arduino和MicroPython开发生态让软件开发的起点变得非常友好。然而它的局限性也很明显计算能力有限无法运行复杂的视觉模型存储空间小通常需要外接MicroSD卡来存储图片、视频或模型文件仅有一个GPIO口引出扩展性受制约。因此我们的项目设计必须围绕这些特点展开扬长避短。2.2 电源方案稳定压倒一切智能门禁设备最忌讳断电重启。ESP32-CAM的工作电压是3.3V但峰值电流可能超过500mA尤其是在启动摄像头、进行Wi-Fi传输或点亮补光灯时。直接用一个5V/1A的手机充电头接USB转TTL模块的5V引脚给板子供电是极不稳定的做法电压波动极易导致设备重启或摄像头初始化失败。正确的做法是使用一个独立的5V/2A直流电源适配器其输出端接一个降压稳压模块如AMS1117-3.3或效率更高的MP1584EN模块将电压稳定在3.3V后再供给ESP32-CAM的3.3V引脚。同时建议在电源输入端并联一个470μF以上的电解电容来滤除低频干扰在3.3V输出端并联一个100μF的钽电容和一个0.1μF的陶瓷电容来滤除高频噪声。这套电源方案成本增加不到十元但换来的系统稳定性是质的提升。2.3 外围电路与扩展设计由于GPIO有限我们需要精打细算门铃按钮连接到一个GPIO口如GPIO13配置为上拉输入。当按钮按下引脚被拉低触发中断。红外补光灯控制ESP32-CAM板载了一个红外LED通常由GPIO4控制。但为了夜间成像更清晰可以外接一个由MOS管如IRF520驱动的大功率红外LED阵列同样由GPIO4控制。状态指示可以复用板载的红色LED连接GPIO33或者外接一个WS2812 RGB LED用于指示设备状态如启动中、连接Wi-Fi、识别成功、报警等。麦克风模块可选为了实现异常声音检测可以添加一个MAX9814这类带自动增益控制的麦克风模块其模拟输出连接到ESP32的某个ADC引脚如GPIO34。MicroSD卡模块几乎是必选项用于存储捕获的图片、识别日志、甚至是一小段视频缓存。通过SPI接口GPIO14/CLK, GPIO15/MOSI, GPIO2/MISO, GPIO13/CS连接。一个典型的接线示意图如下以具体引脚为例需根据板子型号调整外设模块连接至ESP32-CAM引脚备注5V电源输入外部5V - 降压模块 - 板子3.3V严禁直接接板子5V或VCC引脚门铃按钮GPIO13 (配置为上拉输入)另一端接地红外LED驱动GPIO4通过MOS管驱动大电流红外LEDSD卡模块 (SPI)CLK: GPIO14, MOSI: GPIO15, MISO: GPIO2, CS: GPIO13注意GPIO13可能与按钮冲突需分时复用或换引脚麦克风模块 (模拟)模拟输出 - GPIO34需在代码中配置ADC状态LEDGPIO33 (板载LED) 或 GPIOxx (外接WS2812)注意ESP32-CAM的GPIO0和GPIO2在启动时有特殊电平要求通常不建议用于普通输入输出以免导致设备进入下载模式无法启动。务必查阅你所使用的具体板型的原理图。2.4 外壳与安装的工程考量设备将长期暴露在门口面临温差、湿度、灰尘甚至人为破坏的挑战。一个3D打印的防水防尘外壳是必要的。设计时需考虑摄像头开孔精确对准镜头并采用透明亚克力或玻璃进行保护注意防止内部起雾。散热ESP32在持续工作时会发热外壳需有通风孔但又要防止进水。按钮与指示灯开孔方便用户操作和查看状态。走线孔为电源线、可能的网线如果未来升级预留密封接口。安装方式设计卡扣或螺丝孔便于固定在门框或墙壁上。3. 固件开发从图像捕获到智能识别硬件搭建好后大脑固件才是项目的灵魂。我们将功能分层实现从底层的驱动到上层的业务逻辑。3.1 开发环境搭建与基础框架推荐使用Arduino IDE或PlatformIOVS Code插件。PlatformIO在库管理、项目结构上更专业。首先需要安装ESP32开发板支持并添加必要的库esp32-camera官方摄像头驱动库。EloquentTinyML或TensorFlow Lite Micro用于在ESP32上运行轻量级AI模型。ArduinoJson用于处理配置文件和网络请求。PubSubClient如果使用MQTT协议进行通信。SD用于SD卡读写。程序的主框架应该是一个状态机避免使用delay()进行阻塞而是采用非阻塞的定时器和事件驱动机制。核心循环结构如下#include esp_camera.h #include WiFi.h #include SD.h // 定义状态 enum SystemState { BOOTING, CONNECTING_WIFI, IDLE, MOTION_DETECTED, FACE_RECOGNIZING, UPLOADING, ALERTING }; SystemState currentState BOOTING; unsigned long lastCaptureTime 0; const long captureInterval 1000; // 图像捕获间隔(ms) void setup() { Serial.begin(115200); initCamera(); initSDCard(); initWiFi(); // 其他初始化... currentState IDLE; } void loop() { switch (currentState) { case IDLE: checkMotion(); // 非阻塞式运动检测 checkDoorbell(); // 检测门铃按钮 break; case MOTION_DETECTED: captureAndProcessImage(); break; case FACE_RECOGNIZING: runFaceRecognition(); break; // ... 其他状态处理 } // 其他周期性任务如看门狗喂狗、状态LED控制等 }3.2 摄像头驱动与图像采集优化esp_camera库提供了丰富的配置。对于门禁场景我们不需要很高的帧率但需要较好的图像质量和低光照表现。camera_config_t config; config.ledc_channel LEDC_CHANNEL_0; config.ledc_timer LEDC_TIMER_0; config.pin_d0 5; config.pin_d1 18; // ... 根据你的板子型号正确配置所有引脚 config.pin_xclk 0; config.pin_pclk 22; config.pin_vsync 25; config.pin_href 23; config.pin_sscb_sda 26; config.pin_sscb_scl 27; config.pin_pwdn 32; config.pin_reset -1; config.xclk_freq_hz 20000000; // XCLK频率影响帧率 config.pixel_format PIXFORMAT_JPEG; // 输出JPEG节省内存和带宽 config.frame_size FRAMESIZE_SVGA; // 800x600在识别精度和速度间平衡 config.jpeg_quality 12; // 质量(0-63越小质量越高)12-15是比较好的平衡点 config.fb_count 2; // 帧缓冲区数量 // 初始化摄像头 esp_err_t err esp_camera_init(config); if (err ! ESP_OK) { Serial.printf(摄像头初始化失败 0x%x, err); return; }关键参数解析frame_size:FRAMESIZE_SVGA (800x600)是一个甜点。分辨率太低如QVGA人脸特征模糊影响识别太高如UXGA处理速度慢内存易爆。SVGA在ESP32-CAM的PSRAM支持下可以流畅处理。jpeg_quality: 默认的10质量很高但图片大。实测12-15在门禁场景下人脸可识别度足够图片体积能减少30%-50%极大提升无线传输效率和SD卡存储容量。fb_count: 设置为2双缓冲可以在处理一帧图像时摄像头继续捕获下一帧避免丢帧。3.3 运动检测与误报过滤单纯依靠像素变化检测运动一阵风吹动树叶或者光线变化都会引发海量误报。我们需要更聪明的算法。背景差分法是基础。但ESP32上实现完整的背景建模如高斯混合模型计算量太大。一个实用的折中方案是降采样处理将捕获的JPEG图像解码后转换为灰度图并缩放至160x120或更小的分辨率。计算帧间差分比较当前帧与上一帧或背景帧每个像素的灰度值差异超过阈值则记为变化像素。区域与连续性过滤统计变化像素的数量和连通区域。如果变化像素总数低于一个阈值如总像素的0.5%或者最大的连通区域面积很小则忽略。只有变化区域足够大、足够集中时才判定为有效运动如一个人形轮廓。背景更新在判定为无运动或误报的帧缓慢更新背景帧以适应光照的缓慢变化如日出日落。bool detectMeaningfulMotion(camera_fb_t *fb) { // 1. 将fb-buf (JPEG) 解码为灰度矩阵 currentGray // 2. 与 backgroundGray 矩阵进行差分得到 diffMatrix // 3. 对 diffMatrix 二值化统计白色像素点数量 changedPixels // 4. 如果 changedPixels NOISE_THRESHOLD return false // 5. 对二值图像进行腐蚀、膨胀操作去除噪声点 // 6. 寻找轮廓计算最大轮廓面积 maxContourArea // 7. 如果 maxContourArea MIN_OBJECT_AREA return false // 8. 判定为有效运动 return true // 9. 在非运动帧 backgroundGray backgroundGray * 0.99 currentGray * 0.01 (缓慢更新) }3.4 轻量级人脸识别与本地决策这是项目的核心智能部分。我们无法在ESP32上运行庞大的FaceNet或ArcFace模型但可以运行专门为微控制器优化的轻量级模型如MobileFaceNet或FastFace的TFLite版本。工作流程人脸检测首先从图像中框出人脸。可以使用一个超轻量级的人脸检测模型如基于SSD的8位量化模型或者使用经典的Haar级联分类器OpenCV提供后者在ESP32上通过精心优化也能达到实时。对齐与预处理检测到的人脸框需要被裁剪出来并进行对齐眼睛水平、缩放到模型输入尺寸如112x112、归一化像素值。特征提取将预处理后的人脸图像送入训练好的MobileFaceNet TFLite模型输出一个128维或256维的特征向量Embedding。这个向量就是这张人脸的“数学指纹”。特征比对1:N识别将提取的特征向量与预先存储在SD卡或SPIFFS中的“已注册人脸特征库”进行比对。比对方法通常是计算余弦相似度或欧氏距离。距离越小相似度越高。决策与阈值设定一个相似度阈值如余弦相似度 0.6。如果与库中某个人脸特征的距离小于阈值则识别为“已知人员”否则标记为“陌生人”。// 伪代码示例 #include EloquentTinyML.h // 或 TensorFlowLite_ESP32 库 Eloquent::TinyML::TfLite128, 112, 112, 3, 3 faceNet; // 假设模型参数 float knownFaceEmbeddings[10][128]; // 已知人脸特征库 char *knownFaceLabels[10] {Family_Member_1, Family_Member_2}; String recognizeFace(camera_fb_t *fb, float *faceBox) { // 1. 根据faceBox裁剪人脸区域图像 faceImg // 2. 对齐、缩放、归一化 faceImg 到 112x112x3 // 3. faceNet.predict(faceImg, outputEmbedding); // 提取特征向量 // 4. 遍历 knownFaceEmbeddings float bestScore -1.0; int bestIndex -1; for (int i 0; i knownFaceCount; i) { float similarity cosineSimilarity(outputEmbedding, knownFaceEmbeddings[i]); if (similarity THRESHOLD similarity bestScore) { bestScore similarity; bestIndex i; } } if (bestIndex ! -1) { return String(Known:) knownFaceLabels[bestIndex] String( Score:) bestScore; } else { return Stranger; } }实操心得模型选择优先选择已经量化INT8的TFLite模型速度更快内存占用更小。自己训练模型后务必使用TFLite转换工具进行量化。特征库构建注册新人脸时最好采集多张不同角度、不同光照下的照片提取特征后取平均值作为该人的最终特征向量能显著提高识别鲁棒性。阈值调优阈值不是固定的。需要在你的实际环境中你家门口的光线、角度收集正样本家人和负样本快递员、邻居图片绘制相似度分布曲线找到一个平衡误识率FRR和误接受率FAR的阈值。4. 网络通信与安全策略设备需要与外界通信上传图片、发送警报、接收指令。通信必须可靠且安全。4.1 Wi-Fi连接的稳健性处理家用Wi-Fi路由器可能重启信号可能波动。固件必须能优雅地处理断线重连。#include WiFi.h #include WiFiClientSecure.h const char* ssid Your_SSID; const char* password Your_PASSWORD; void initWiFi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print(Connecting to WiFi ..); int attempts 0; while (WiFi.status() ! WL_CONNECTED attempts 20) { Serial.print(.); delay(1000); attempts; } if (WiFi.status() WL_CONNECTED) { Serial.println(\nConnected. IP: WiFi.localIP().toString()); } else { Serial.println(\nFailed to connect. Entering deep sleep or retry later.); // 可以在这里进入深度睡眠定时唤醒重试避免耗电死循环 } // 注册事件处理 WiFi.onEvent(WiFiStationDisconnected, SYSTEM_EVENT_STA_DISCONNECTED); } void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info) { Serial.println(WiFi lost connection. Attempting to reconnect...); // 简单的重连逻辑也可加入指数退避算法 WiFi.reconnect(); }4.2 数据传输协议选型MQTT vs HTTP APIMQTT轻量级发布/订阅模型非常适合物联网设备。设备作为客户端订阅指令主题如/smartdoor/001/cmd发布数据主题如/smartdoor/001/event。优点是功耗低、实时性好、支持离线消息需Broker支持。你需要一个MQTT Broker可以是云服务如EMQX Cloud需注意数据安全也可以是部署在内网树莓派上的Mosquitto。HTTP/HTTPS API更通用直接与你的后端服务器通信。每次事件发生时设备构造一个HTTP POST请求将图片Base64编码或二进制分块和JSON数据时间、事件类型、识别结果发送到指定的API端点。实现简单但开销比MQTT大。对于家庭安全场景我推荐MQTT over TLS加密连接到内网Broker。这样所有数据不出局域网延迟极低安全性高。ESP32-CAM支持TLS但需要将Broker的根证书预置到设备中。4.3 数据上报与远程交互设计定义清晰的事件类型和消息格式是关键。一个JSON格式的消息示例{ device_id: esp32cam_door_001, timestamp: 1689325200, event_type: motion_alert, // 或 face_recognized, doorbell_ring, stranger_alert data: { image_url: /sd/alert_20230712_102030.jpg, // 或直接包含Base64缩略图 recognition_result: Stranger, // 或 Known:Father confidence: 0.75, sensor_data: { pir_triggered: true } } }设备根据事件类型决定动作运动警报检测到有效运动立即捕获一张图片进行快速人脸检测不一定是识别。如果是人脸则启动完整识别流程如果不是可能是动物、车灯可以降低警报等级或忽略。图片保存至SD卡并通过MQTT发布一个motion_alert事件附上小尺寸的Base64缩略图供手机预览。人脸识别结果识别完成后发布face_recognized或stranger_alert事件。对于陌生人可以连续抓拍多张图片并保存。门铃按下发布doorbell_ring事件。可以同时点亮一个提示灯或发出本地提示音如果接了扬声器并开始一段时间的视频流推流如果服务器支持让户主实时对话。4.4 本地视频流与远程查看除了事件触发有时我们需要主动查看门口实时画面。ESP32-CAM可以作为一个视频流服务器。#include ESPAsyncWebServer.h AsyncWebServer server(80); void setupStreaming() { // 创建一个用于传输视频流的端点 server.on(/stream, HTTP_GET, [](AsyncWebServerRequest *request){ AsyncWebServerResponse *response request-beginResponseChunked(multipart/x-mixed-replace; boundaryframe); while(true) { camera_fb_t * fb esp_camera_fb_get(); if (!fb) { continue; } response-printf(--frame\r\nContent-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n, fb-len); response-write(fb-buf, fb-len); esp_camera_fb_return(fb); delay(1000 / 30); // 控制帧率如30fps } }); server.begin(); }在手机或电脑浏览器输入http://[ESP32-IP]/stream就能看到实时MJPEG流。请注意高帧率视频流会大量占用Wi-Fi带宽和ESP32的CPU资源可能影响其他任务如运动检测的实时性。通常只在需要时如门铃按下后开启一段时间或者以极低的帧率如1-5 fps进行后台流式传输用于远程监控。5. 服务器端与客户端构建设备端是感知和决策的边缘节点服务器端则是大脑和交互中心。一个简单的架构可以这样设计5.1 后端服务以Python Flask为例后端运行在内网的一台常开机的电脑或树莓派上主要职责MQTT Broker使用mosquitto或集成emqx。事件订阅与处理订阅ESP32发布的所有主题。图像存储与管理收到带图片的事件后将图片从Base64解码或通过HTTP从设备拉取保存到硬盘并记录到数据库如SQLite。推送通知当收到stranger_alert或doorbell_ring事件时调用手机推送服务如Bark、PushDeer或自建的WebSocket服务向户主手机发送警报。提供查询API提供一个简单的Web界面或API供用户查看历史事件、管理已注册人脸。# 伪代码示例 (Flask Paho MQTT) import paho.mqtt.client as mqtt from flask import Flask, jsonify, send_file import json, base64, cv2, sqlite3 app Flask(__name__) def on_message(client, userdata, msg): payload json.loads(msg.payload.decode()) event_type payload[event_type] device_id payload[device_id] if event_type stranger_alert: img_data base64.b64decode(payload[data][image_base64]) # 保存图片 filename falerts/{device_id}_{payload[timestamp]}.jpg with open(filename, wb) as f: f.write(img_data) # 存入数据库 db_insert_alert(device_id, payload[timestamp], filename, stranger) # 发送手机推送 send_push_notification(f陌生人警报于 {payload[timestamp]}!) # 处理其他事件... mqtt_client mqtt.Client() mqtt_client.on_message on_message mqtt_client.connect(localhost, 1883, 60) mqtt_client.subscribe(smartdoor//event) mqtt_client.loop_start() app.route(/events) def get_events(): # 从数据库查询最近事件并返回JSON pass if __name__ __main__: app.run(host0.0.0.0, port5000)5.2 前端界面与移动端一个极简的Web界面足以满足大部分需求实时视频查看一个img标签其src属性指向http://[ESP32-IP]/stream。事件时间线通过Fetch API从后端/events接口获取JSON数据以卡片形式展示点击可查看大图。人脸管理上传家人照片后端负责提取特征向量并同步到ESP32-CAM的SD卡中可以通过一个特殊的MQTT指令或HTTP接口触发设备下载更新特征库文件。对于移动端可以封装上述Web界面为一个简单的混合应用如使用Flutter或React Native或者直接使用支持推送通知的App框架。6. 系统集成、调试与优化心得将硬件、固件、服务器、前端全部打通后真正的挑战才开始。以下是我在集成和长期运行中积累的一些关键经验。6.1 电源与信号干扰排查问题设备运行一段时间后无故重启摄像头初始化失败。排查首先怀疑电源。用万用表监测3.3V引脚电压在摄像头启动瞬间电压被拉低至3.0V以下触发ESP32的欠压复位。解决如第2.2节所述升级电源方案。将5V/1A适配器换为5V/2A并在AMS1117模块的输入输出端并联大容量电容。同时确保电源走线粗短避免过长导线引入压降。6.2 SD卡兼容性与文件系统问题SD卡偶尔无法挂载或写入图片时失败。排查ESP32-CAM对SD卡尤其是TF卡加卡套的兼容性一般。不同品牌、不同速度等级的卡表现差异大。解决选择品牌卡优先使用SanDisk、Kingston等知名品牌的Class10或U1规格的MicroSD卡容量无需过大32GB足够。避免使用杂牌卡。格式化使用电脑的磁盘工具如diskpart命令或SD Card Formatter工具将卡格式化为FAT32文件系统分配单元大小设为4096字节。文件操作优化避免频繁打开关闭文件。例如可以打开一个日志文件持续追加写入定时刷入而不是每条日志都open-write-close。对于图片写入完成后立即关闭文件句柄。异常处理在代码中所有SD卡操作周围添加try-catch并在失败时尝试重新初始化SD卡。6.3 人脸识别的误报与光线对抗问题夜间识别率低白天强逆光时容易将阴影误识为人脸。解决红外补光充分利用GPIO4控制红外LED。在环境光低于一定阈值通过光敏电阻或摄像头图像平均亮度判断时自动开启红外补光。注意调整红外LED的角度避免直射镜头产生光晕。动态曝光调整esp_camera库允许通过sensor_t *s esp_camera_sensor_get(); s-set_gain_ctrl(s, 1);等函数自动或手动调整传感器增益、曝光时间改善低光效果。多帧验证对于识别结果不要单帧定论。可以连续捕获3-5帧只有超过半数帧都识别为同一个人才最终确认结果。这能有效过滤瞬间的误识别。区域屏蔽ROI如果摄像头视角内包含经常晃动的树木或霓虹灯可以在运动检测和人脸检测阶段通过软件屏蔽这些固定区域减少干扰。6.4 网络延迟与断线处理问题门铃按下后手机推送延迟十几秒甚至收不到。排查链路可能很长ESP32 - Wi-Fi - 路由器 - MQTT Broker - 后端服务 - 推送服务 - 手机网络。任何一个环节都可能成为瓶颈。解决本地化优先确保MQTT Broker和后端服务都在家庭内网消除公网延迟。消息分级对于doorbell_ring这种需要极速响应的消息设备端可以同时尝试多种方式发布MQTT消息并直接向一个高优先级的HTTP端点发送一个轻量级的ping通知。Wi-Fi信号优化将ESP32-CAM安装在门口其Wi-Fi信号可能被金属门体削弱。可以考虑使用Wi-Fi中继器或者选择天线外置的ESP32-CAM模块版本。心跳与状态监控设备定期如每5分钟发布一个heartbeat消息。后端服务监控此心跳如果超时未收到则在管理界面提示“设备离线”便于及时排查。6.5 安全性加固这是一个家庭安防设备自身安全也不能忽视。Wi-Fi凭证不要硬编码在代码里。首次启动时让设备进入AP模式如SmartDoor_Config用户用手机连接后通过一个配置页面输入Wi-Fi SSID和密码。设备保存至非易失存储NVS。通信加密MQTT务必使用TLS加密端口8883。需要在设备端预置Broker的证书。HTTP API应使用HTTPS。视频流访问控制视频流端点/stream应设置简单的HTTP基本认证或者在查询参数中携带动态令牌Token防止邻居或路人随意窥探。固件更新OTA实现HTTP OTA或通过MQTT触发OTA更新的功能以便远程修复漏洞和升级功能。更新过程需校验签名防止恶意固件上传。这个项目从构思到稳定运行我前后迭代了四五个版本。最大的体会是在资源受限的嵌入式设备上做AI应用“妥协”和“优化”是常态。没有完美的方案只有在特定约束下的最佳权衡。例如为了识别速度我们降低了图像分辨率为了减少误报我们增加了多帧验证逻辑为了保证稳定性我们设计了复杂的电源和看门狗机制。每一次调试和优化都让我对ESP32-CAM的潜力边界和物联网系统设计有了更深的理解。现在这个“安全哨站”已经在我家门口默默值守了大半年准确识别家人、提醒快递上门、记录可疑徘徊成为了我智能家居系统中一个可靠而安静的守护者。如果你也打算开始不妨从最简单的运动检测拍照开始逐步添加人脸识别、本地服务器最终构建起属于你自己的完整安防体系。
返回列表