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

news2024/11/27 7:29:58


人脸检测项目效果图:

人脸检测效果视频:

            暮年的主页 - 抖音 (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视频流:


一份耕耘,一份收获。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文总结ACE代码框架

一、前言ACE_Engine框架是OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;的UI开发框架&#xff0c;为开发者提供在进行应用UI开发时所必需的各种组件&#xff0c;以及定义这些组件的属性、样式、事件及方法&#xff0c;通过这些组件可以方便进行OpenHarmony…

JavaScript面试题

目录1.★★ 介绍一下JS的内置类型有哪些&#xff1f;2.★★★★ 介绍一下 typeof 区分类型的原理3.★★★ 介绍一下类型转换4.★★★★ 说说你对 JavaScript 的作用域的理解。什么是作用域链&#xff1f;5.★★ 解释下 let 和 const 的块级作用域6.★★★★ 说说你对执行上下文…

用Vue+Nodejs+Axios+express连接Sqlserver做一个动态网页demo

文章目录一、主要工具二、流程2.1. 安装Node2.2. 新建Vue工程并启动2.3. 前后端通信2.3.1. 修改前端2.3.2. 用axios来发起请求2.3.3. 创建服务端程序一、主要工具 Vue做前端页面Nodejs做服务器后端&#xff08;Nodejs是一个JS的运行环境&#xff0c;可以让JS像其它后端语言一样…

使用超体素上下文和基于图的优化从MLS点云对城市地区的树木进行实例分割

Abstract 在本文中&#xff0c;开发了一种用于从城市场景中的 MLS 数据集中提取树木的实例分割方法。所提出的方法利用超体素结构来组织点云&#xff0c;然后从超体素的局部上下文中提取去除趋势的几何特征。结合局部上下文的去趋势特征&#xff0c;将采用随机森林&#xff08…

Qt基于CTK Plugin Framework搭建插件框架--创建插件

文章目录一、前言二、工程搭建2.1、新建Qt工程2.2、CTK环境配置三、CTK Plugin Framework使用3.1、主函数启动插件框架3.2、插件的创建3.3、插件的使用一、前言 CTK保姆级编译教程&#xff1a;https://blog.csdn.net/Mr_robot_strange/article/details/128547331?spm1001.201…

JavaGUI:多功能计算器(五)--Swing实现双语数据包+菜单切换(完整源码)

JavaGUI&#xff1a;多功能计算器&#xff08;五&#xff09;–Swing实现双语数据包菜单切换&#xff08;完整源码&#xff09; 【背景提示】 “软件国际化”就是实现多种语言显示切换。 1.在前端网页上&#xff0c;可通过探测本地化语言环境实现自动切换&#xff1b; 2.在操…

C++ 20 原子引用 (一)

C 20 原子引用 &#xff08;一&#xff09; std::atomic_ref{} std::atomic_ref类型对其引用的对象进行原子操作。 使用std::atomic_ref 进行多线程读写时不会造成数据争用。被引用对象的生命周期必须超过std::atomic_ref 。操作std::atomic_ref 的子对象是未定义行为。 错…

Docker版RabbitMQ安装延迟队列插件及延迟队列项目应用实战

前言 在项目中经常有延迟业务处理的背景&#xff0c;此时可以借助于Rabbitmq的延迟队列进行实现&#xff0c;但Rabbitmq本身并不支持延迟队列&#xff0c;但可以通过安装插件的方式实现延迟队列 环境准备 首先确认目前项目使用的Rabbitmq的版本&#xff0c;这里博主的版本是3.…

STM32系列(HAL库)——使用ESP8266-01S物联网模块连接Onenet云平台上报DHT11温湿度

前言 本篇主要讲解如何使用ESP8266-01S物联网模块连接Onenet云平台&#xff0c;并上报DHT11模块的温湿度数据。本文单片机主控采用STM32F405RGT6&#xff0c;使用其他主控的话基本要求有2个串口&#xff0c;一个串口用于调试使用&#xff0c;另一个用于ESP模块通讯。 一、前…

SOLIDWORKS 2023工程图和出详图新功能 创建更智能化 更高精度的工程详图

工程图是传达您设计意图的重要文档&#xff0c;您设计的产品越复杂&#xff0c;越需要详细注释说明。SOLIDWORKS 2023增强的工程图和出详图功能将帮助您创建更智能化、更高精度的工程详图&#xff0c;并且扩展新功能使您的设计工作延伸到更多的业务领域。您现在可以从更高层级的…

C 程序设计教程(15)—— 选择结构程序设计练习题

C 程序设计教程&#xff08;15&#xff09;—— 选择结构程序设计练习题 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录C 程序设计教程&#xff08;1…

20230110配置ubuntu18.04为开机自动登录

20230110配置ubuntu18.04为开机自动登录 百度搜索&#xff1a;ubuntu 18.04 开机自动登录 https://blog.csdn.net/yang1994/article/details/124446319 通过配置文件启用/禁用Ubuntu 18.04自动登录 超级用户可以通过编辑custom.conf配置文件的方式&#xff0c;来为自己或任何其…

计算机如何存储浮点数和定点数?

1 浮点数的不精确性 能不能用二进制表示所有实数&#xff0c;然后在二进制下计算它的加减乘除呢&#xff1f; 打开Chrome Console&#xff0c;输入0.3 0.6&#xff1a; 简单加法在js算出结果居然不是准确的0.9&#xff0c;而是0.8999999999999999&#xff0c;why&#xff1…

火山语音丨AI创作惊艳四方 诸多挑战仍在路上

2022年8月&#xff0c;一幅名为《太空歌剧院》的数字画作获得冠军同时引发了巨大争议&#xff0c;AIGC&#xff08;AI产生内容&#xff1a;AI-Generated Content&#xff09;出圈的事件便频频出现在大众视野。同年11月30日OpenAI发布的聊天机器人模型ChatGPT免费开放&#xff0…

从0到1完成一个Vue后台管理项目(二十、地图涟漪、线图)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

缓存穿透、布隆过滤器、布谷鸟过滤器

1.概述 缓存穿透&#xff1a; 当查询的数据在缓存&#xff08;redis&#xff09;中没有时&#xff0c;一般业务上就会去查询数据存储&#xff08;数据库&#xff09;&#xff0c;这种情况称为缓存穿透。穿透的数量太大会造成数据存储撑不住&#xff08;数据库&#xff09;而宕…

基于控制器软件需求事项进行单元测试和单元测试规范

基于需求事项的单元测试是什么&#xff1f; ​ 大多数汽车行业都遵循 ISO 26262 中定义的标准&#xff0c;这是 ISO 制定的汽车功能安全国际标准。 根据 ISO 26262 标准软件单元测试 (ISO 26262-6-9)&#xff0c;单元验证是验证要验证的单元&#xff08;功能或功能&#xff09…

智能优化算法应用:基于蜣螂优化算法的工程优化案例

智能优化算法应用&#xff1a;基于蜣螂算法的工程优化案例 文章目录智能优化算法应用&#xff1a;基于蜣螂算法的工程优化案例1.蜣螂算法2.压力容器设计问题3.三杆桁架设计问题4.拉压弹簧设计问题5.Matlab代码6.Python代码摘要&#xff1a;本文介绍利用蜣螂搜索算法&#xff0c…

MyBatis框架知识点总结

一、引言1.1 什么是框架&#xff1f;框架&#xff1a;框架使用你的&#xff0c;而不是你在使用框架的。框架让我们提供什么信息&#xff0c;配置信息&#xff0c;数据库连接用户名密码等&#xff0c;你必须提供&#xff0c;还得按照框架要要求的方式提供&#xff0c;否则你就别…

《图机器学习》-Node Embeddings

Node Embeddings一、Graph Representation Learning二、Node Embeddings&#xff1a;Encoder and Decoder三、Random Walk Approaches for Node Embeddings一、Graph Representation Learning 在传统的图机器学习中&#xff0c;依赖于手工特征工程(即由特征工程师去设计节点、…