当前位置:   article > 正文

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

esp32人脸识别


人脸检测项目效果图:

人脸检测效果视频:

            暮年的主页 - 抖音 (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源码:

  1. #include <esp32cam.h>
  2. #include <WebServer.h>
  3. #include <WiFi.h>
  4. const char* WIFI_SSID = "ESP32"; // 改成自己的wifi名称
  5. const char* WIFI_PASS = "12345678"; // 改成自己的wifi密码
  6. WebServer server(80);
  7. static auto loRes = esp32cam::Resolution::find(320, 240);
  8. static auto hiRes = esp32cam::Resolution::find(800, 600);
  9. void handleBmp()
  10. {
  11. if (!esp32cam::Camera.changeResolution(loRes)) {
  12. Serial.println("SET-LO-RES FAIL");
  13. }
  14. auto frame = esp32cam::capture();
  15. if (frame == nullptr) {
  16. Serial.println("CAPTURE FAIL");
  17. server.send(503, "", "");
  18. return;
  19. }
  20. Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
  21. static_cast<int>(frame->size()));
  22. if (!frame->toBmp()) {
  23. Serial.println("CONVERT FAIL");
  24. server.send(503, "", "");
  25. return;
  26. }
  27. Serial.printf("CONVERT OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
  28. static_cast<int>(frame->size()));
  29. server.setContentLength(frame->size());
  30. server.send(200, "image/bmp");
  31. WiFiClient client = server.client();
  32. frame->writeTo(client);
  33. }
  34. void serveJpg()
  35. {
  36. auto frame = esp32cam::capture();
  37. if (frame == nullptr) {
  38. Serial.println("CAPTURE FAIL");
  39. server.send(503, "", "");
  40. return;
  41. }
  42. Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
  43. static_cast<int>(frame->size()));
  44. server.setContentLength(frame->size());
  45. server.send(200, "image/jpeg");
  46. WiFiClient client = server.client();
  47. frame->writeTo(client);
  48. }
  49. void handleJpgLo()
  50. {
  51. if (!esp32cam::Camera.changeResolution(loRes)) {
  52. Serial.println("SET-LO-RES FAIL");
  53. }
  54. serveJpg();
  55. }
  56. void handleJpgHi()
  57. {
  58. if (!esp32cam::Camera.changeResolution(hiRes)) {
  59. Serial.println("SET-HI-RES FAIL");
  60. }
  61. serveJpg();
  62. }
  63. void handleJpg()
  64. {
  65. server.sendHeader("Location", "/cam-hi.jpg");
  66. server.send(302, "", "");
  67. }
  68. void handleMjpeg()
  69. {
  70. if (!esp32cam::Camera.changeResolution(hiRes)) {
  71. Serial.println("SET-HI-RES FAIL");
  72. }
  73. Serial.println("STREAM BEGIN");
  74. WiFiClient client = server.client();
  75. auto startTime = millis();
  76. int res = esp32cam::Camera.streamMjpeg(client);
  77. if (res <= 0) {
  78. Serial.printf("STREAM ERROR %d\n", res);
  79. return;
  80. }
  81. auto duration = millis() - startTime;
  82. Serial.printf("STREAM END %dfrm %0.2ffps\n", res, 1000.0 * res / duration);
  83. }
  84. void setup()
  85. {
  86. Serial.begin(115200);
  87. Serial.println();
  88. {
  89. using namespace esp32cam;
  90. Config cfg;
  91. cfg.setPins(pins::AiThinker);
  92. cfg.setResolution(loRes);
  93. cfg.setBufferCount(2);
  94. cfg.setJpeg(80);
  95. bool ok = Camera.begin(cfg);
  96. Serial.println(ok ? "CAMERA OK" : "CAMERA FAIL");
  97. }
  98. WiFi.persistent(false);
  99. WiFi.mode(WIFI_STA);
  100. WiFi.begin(WIFI_SSID, WIFI_PASS);
  101. while (WiFi.status() != WL_CONNECTED) {
  102. delay(500);
  103. }
  104. Serial.print("http://");
  105. Serial.println(WiFi.localIP());
  106. Serial.println(" /cam.bmp");
  107. Serial.println(" /cam-lo.jpg");
  108. Serial.println(" /cam-hi.jpg");
  109. Serial.println(" /cam.mjpeg");
  110. server.on("/cam.bmp", handleBmp);
  111. server.on("/cam-lo.jpg", handleJpgLo);
  112. server.on("/cam-hi.jpg", handleJpgHi);
  113. server.on("/cam.jpg", handleJpg);
  114. server.on("/cam.mjpeg", handleMjpeg);
  115. server.begin();
  116. }
  117. void loop()
  118. {
  119. server.handleClient();
  120. }

ESP32视频流:


一份耕耘,一份收获。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/588207
推荐阅读
相关标签
  

闽ICP备14008679号