【ESP32Cam项目1】:ESP32Cam人脸检测(ArduinoESP32底层、Python版opencv)


人脸检测项目效果图:

人脸检测效果视频:

            暮年的主页 - 抖音 (douyin.com)


人脸检测项目目标:

        大家好!近期拿到了便宜的ESP32Cam开发板,摄像头让我想起来人脸识别,于是ESP32Cam人脸检测项目由此诞生。后期还有其他项目:

        ESP32Cam的优势:

ESP32-CAM是安信可最新发布小尺寸的摄像头模组。该模块可以作为最小系统独立工作,尺寸仅为27*40.5*4.5mm,深度睡眠电流最低达到6mA。

ESP32-CAM可广泛应用于各种物联网场合,适用于家庭智能设备、工业无线控制、无线监控、QR无线识别,无线定位系统信号以及其它物联网应用,是物联网应用的理想解决方案。

ESP32-CAM采用DIP封装,直接插上底板即可使用,实现产品的快速生产,为客户提供高可靠性的连接方式,方便应用于各种物联网硬件终端场合。

以下官网介绍:

                             ESP32-CAM摄像头开发板 | 安信可科技 (ai-thinker.com)

        1.人脸检测

        2.人脸识别(后续新的文章介绍)


人脸检测项目环境:

        1.Arduino  ESP32环境如下        

        2.Pycharm  opencv环境如下


 人脸检测项目链接

                              百度网盘 请输入提取码


人脸检测项目心路历程:

        大家一定要知道做一个东西的前提是环境要搭建好,这样做项目才能顺畅。首先就是下载软件,安装各种库和开发板管理,这些其实vscode一个软件就能做到,我仍然感觉术业有专攻,所以大家也可以下载一下。

        特此鸣谢以下博主对个人的帮助:

                ESP32-CAM摄像头+Arduino IDE+Web Server局域网显示 - 知乎 (zhihu.com)

                【开源】ESP32-cam+python 实现人脸识别(opencv)_哔哩哔哩_bilibili

                ESP32-CAM使用+源码分析 - 腾讯云开发者社区-腾讯云 (tencent.com)

     【ESP32-CAM】使用opencv获取ESP32-CAM视频流(一)_随笔_内存溢出 (outofmemory.cn)

大家没有思路的时候可以参考以上博主,别在知识的海洋迷路!

arduino配置:

硬件图:

        

                   

 建议大家购买ESP32Cam的时候开发板转接板,这个更方便自己操作。

 


 Arduino成功下载程序界面:

  ESP32Cam成功连接目标wifi串口界面:

 Pycharm配置:

 

 安装及库的安装,可以参照我以前的文章:

        (56条消息) Python安装与使用_嵌入式up的博客-CSDN博客_python安装和使用

(56条消息) 【python养成】:pip3如何安装依赖库和换国内源安装库_嵌入式up的博客-CSDN博客_pip3 换源

opencv的使用还请大家自行学习,这里不做概述,上面也有项目可以练手。

 Arduino源码:

#include <esp32cam.h>
#include <WebServer.h>
#include <WiFi.h>

const char* WIFI_SSID = "ESP32";  // 改成自己的wifi名称
const char* WIFI_PASS = "12345678";  // 改成自己的wifi密码

WebServer server(80);

static auto loRes = esp32cam::Resolution::find(320, 240);
static auto hiRes = esp32cam::Resolution::find(800, 600);

void handleBmp()
{
  if (!esp32cam::Camera.changeResolution(loRes)) {
    Serial.println("SET-LO-RES FAIL");
  }

  auto frame = esp32cam::capture();
  if (frame == nullptr) {
    Serial.println("CAPTURE FAIL");
    server.send(503, "", "");
    return;
  }
  Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
                static_cast<int>(frame->size()));

  if (!frame->toBmp()) {
    Serial.println("CONVERT FAIL");
    server.send(503, "", "");
    return;
  }
  Serial.printf("CONVERT OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
                static_cast<int>(frame->size()));

  server.setContentLength(frame->size());
  server.send(200, "image/bmp");
  WiFiClient client = server.client();
  frame->writeTo(client);
}

void serveJpg()
{
  auto frame = esp32cam::capture();
  if (frame == nullptr) {
    Serial.println("CAPTURE FAIL");
    server.send(503, "", "");
    return;
  }
  Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
                static_cast<int>(frame->size()));

  server.setContentLength(frame->size());
  server.send(200, "image/jpeg");
  WiFiClient client = server.client();
  frame->writeTo(client);
}

void handleJpgLo()
{
  if (!esp32cam::Camera.changeResolution(loRes)) {
    Serial.println("SET-LO-RES FAIL");
  }
  serveJpg();
}

void handleJpgHi()
{
  if (!esp32cam::Camera.changeResolution(hiRes)) {
    Serial.println("SET-HI-RES FAIL");
  }
  serveJpg();
}

void handleJpg()
{
  server.sendHeader("Location", "/cam-hi.jpg");
  server.send(302, "", "");
}

void handleMjpeg()
{
  if (!esp32cam::Camera.changeResolution(hiRes)) {
    Serial.println("SET-HI-RES FAIL");
  }

  Serial.println("STREAM BEGIN");
  WiFiClient client = server.client();
  auto startTime = millis();
  int res = esp32cam::Camera.streamMjpeg(client);
  if (res <= 0) {
    Serial.printf("STREAM ERROR %d\n", res);
    return;
  }
  auto duration = millis() - startTime;
  Serial.printf("STREAM END %dfrm %0.2ffps\n", res, 1000.0 * res / duration);
}

void setup()
{
  Serial.begin(115200);
  Serial.println();

  {
    using namespace esp32cam;
    Config cfg;
    cfg.setPins(pins::AiThinker);
    cfg.setResolution(loRes);
    cfg.setBufferCount(2);
    cfg.setJpeg(80);

    bool ok = Camera.begin(cfg);
    Serial.println(ok ? "CAMERA OK" : "CAMERA FAIL");
  }

  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  Serial.print("http://");
  Serial.println(WiFi.localIP());
  Serial.println("  /cam.bmp");
  Serial.println("  /cam-lo.jpg");
  Serial.println("  /cam-hi.jpg");
  Serial.println("  /cam.mjpeg");

  server.on("/cam.bmp", handleBmp);
  server.on("/cam-lo.jpg", handleJpgLo);
  server.on("/cam-hi.jpg", handleJpgHi);
  server.on("/cam.jpg", handleJpg);
  server.on("/cam.mjpeg", handleMjpeg);

  server.begin();
}

void loop()
{
  server.handleClient();
}

ESP32视频流:


一份耕耘,一份收获。

                           加油,总会成功的!致敬任何一个努力的孩子。

### 关于ESP32-CAM进行人脸识别的小程序或代码示例 #### 小程序管理人脸数据的编译与部署 对于希望利用微信小程序来管理和展示由ESP32-CAM捕获的人脸识别结果的应用场景而言,开发者可以参照特定指南完成对应示例工程的编译工作[^1]。这通常涉及到设置好本地开发环境以及按照官方文档指示逐步操作。 #### ESP32-CAM配合OpenCV实现人脸识别功能 为了使ESP32-CAM能够执行高效而精准的人脸识别任务,可以通过Arduino IDE加载专门为此设计好的固件程序,并借助强大的计算机视觉库——OpenCV来进行图像处理和特征提取等工作[^2]。下面给出了一段简化的代码片段用于说明如何初始化相机并启动面部检测流程: ```cpp #include "esp_camera.h" // 初始化摄像头参数... void setup() { camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; // 更多配置项... // 安装驱动并开始预览模式 esp_err_t err = esp_camera_init(&config); } ``` 需要注意的是,在实际应用中还需要考虑性能优化方面的问题,比如当开启人脸检测之后设备可能会变得非常缓慢甚至过热,因此建议采取适当措施如增加散热装置以维持稳定运行状态。 #### 实现人体感应触发拍照并通过网络推送至微信平台 除了固定时间间隔内自动抓拍之外,另一种常见的需求是在探测到有人靠近时才激活拍摄动作并将照片发送给指定接收者。这里提供了一个概念性的框架描述了这一过程中的几个关键技术环节[^4]: - 连接PIR传感器监测周围动静; - 当感知到移动信号后立即命令ESP32-CAM记录当前画面; - 使用内置Wi-Fi模块上传图片文件到云服务器或者直接调用微信API接口通知相关人员查看新消息;
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值