当前位置: 首页 > news >正文

Arduino开发 esp32cam+opencv人脸识别距离+语音提醒

效果图

低于20厘米语音提醒字体变红

Arduino代码

可直接复制使用(修改自己的WIFI)

#include <esp32cam.h>
#include <WebServer.h>
#include <WiFi.h>
// 设置要连接的WiFi名称和密码
const char* WIFI_SSID = "gumou"; 
const char* WIFI_PASS = "gu3456789";
WebServer server(80);
// 设置不同分辨率的静态变量
static auto loRes = esp32cam::Resolution::find(320, 240);
static auto hiRes = esp32cam::Resolution::find(1280, 1024);
// 处理BMP图像请求
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;}if (!frame->toBmp()) {Serial.println("CONVERT FAIL");server.send(503, "", "");return;}server.setContentLength(frame->size());server.send(200, "image/bmp");WiFiClient client = server.client();frame->writeTo(client);
}// 服务JPG图像请求
void serveJpg() {auto frame = esp32cam::capture();if (frame == nullptr) {Serial.println("CAPTURE FAIL");server.send(503, "", "");return;}server.setContentLength(frame->size());server.send(200, "image/jpeg");WiFiClient client = server.client();frame->writeTo(client);
}// 处理低分辨率JPG请求
void handleJpgLo() {if (!esp32cam::Camera.changeResolution(loRes)) {Serial.println("SET-LO-RES FAIL");}serveJpg();
}// 处理高分辨率JPG请求
void handleJpgHi() {if (!esp32cam::Camera.changeResolution(hiRes)) {Serial.println("SET-HI-RES FAIL");}serveJpg();
}// 处理JPG请求
void handleJpg() {server.sendHeader("Location", "/cam-hi.jpg");server.send(302, "", "");
}// 处理MJPEG流请求
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(hiRes);cfg.setBufferCount(2);cfg.setJpeg(80);bool ok = Camera.begin(cfg);Serial.println(ok ? "CAMERA OK" : "CAMERA FAIL");}// 连接WiFiWiFi.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的IP地址

录入后,在串口监视器处查看IP(自动会输出)

录入前要把波特率调整115200

python端计算代码

import urllib
import cv2
import numpy as np
from cvzone.FaceMeshModule import FaceMeshDetector
import pygame
import threading
from PIL import Image, ImageDraw, ImageFont
# 初始化pygame.mixer
pygame.mixer.init()
# 加载音频文件
pygame.mixer.music.load('7359.wav')  # 靠的太近啦音频
detector = FaceMeshDetector(maxFaces=1)
url = 'http://192.168.85.168/cam-hi.jpg'  # 改成自己的IP地址+/cam-hi.jpg
# 定义播放音频的函数
def play_audio():pygame.mixer.music.play(1)while pygame.mixer.music.get_busy():continue
# 函数:从ESP32CAM获取图像
def get_esp32cam_image(url):img_resp = urllib.request.urlopen(url)img_np = np.array(bytearray(img_resp.read()), dtype=np.uint8)img = cv2.imdecode(img_np, -1)return img
# 开始检测人脸距离
while True:# 从ESP32CAM获取图像img = get_esp32cam_image(url)# 检测人脸img, faces = detector.findFaceMesh(img, draw=False)if faces:face = faces[0]point_left = face[145]point_right = face[374]w, _ = detector.findDistance(point_left, point_right)W = 6.3f = 600d = (W * f) / wprint(d)# 设置距离颜色if d < 20:print("过近提醒")# 检查是否正在播放音频if not pygame.mixer.music.get_busy():# 使用线程播放音频,避免阻塞主程序audio_thread = threading.Thread(target=play_audio)audio_thread.start()text_color = (255, 0, 0)  # 红色else:text_color = (0, 0, 255)  # 蓝色# 将Depth文本显示为汉语pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(pil_img)font = ImageFont.truetype("msyh.ttc", 36)  # 使用微软雅黑字体,大小为36draw.text((face[10][0] - 95, face[10][1] - 5), f'距离:{int(d)}厘米', font=font, fill=text_color)img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)cv2.imshow("Distance recognition", img)   #这行注释掉后可以不显示摄像头窗口只输出距离if cv2.waitKey(1) == ord('q'):break
cv2.destroyAllWindows()

手机端查看  IP地址同上

图片

http://192.168.85.168/cam-hi.jpg

视频

http://192.168.85.168/cam.mjpeg

项目踩坑

1.驱动ESP32-CAM 这里下载zip自己导入

2.配置开发板 

Arduino中文社区

从这里下载会自动安装指定位置

不要在图中位置配置,速度太慢!!

3.python识别面部距离,需要电脑端和esp32-cam同时连接一个WIFI

由于esp32-cam连WIFI能力较差

(若手机开热点供双方连接,建议esp32-cam先连接后再让电脑连)

相关文章:

Arduino开发 esp32cam+opencv人脸识别距离+语音提醒

效果图 低于20厘米语音提醒字体变红 Arduino代码 可直接复制使用&#xff08;修改自己的WIFI) #include <esp32cam.h> #include <WebServer.h> #include <WiFi.h> // 设置要连接的WiFi名称和密码 const char* WIFI_SSID "gumou"; const char* …...

LeNet卷积神经网络

文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下&#xff1a; self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数&#xff0c;out_cha…...

Python常用算法思想--回溯算法思想详解【附源码】

通过回溯算法解决“组合”问题、“排序”问题、“搜索”之八皇后问题、“子集和”之0-1背包问题、字符串匹配等六个经典案例进行介绍: 一、解决“组合”问题 从给定的一组元素中找到所有可能的组合,这段代码中的 backtrack_combinations 函数使用了回溯思想,调用 backtrack…...

Day5-Hive的结构和优化、数据文件存储格式

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…...

01 计算机网络发展与分类

计算机网络&#xff1a;计算机技术与通信技术的结合。 阶段一&#xff1a;早期网络&#xff1a;ARPAnet。 阶段二&#xff1a;厂商独立发展阶段 阶段三&#xff1a;标准化阶段&#xff1a;ISO,TCP/IP 计算机网络分类 计算机网络分类1&#xff1a;通信子网和资源子网 通信子…...

ubuntu安装sublime3并设置中文

安装Sublime Text 3 在Ubuntu上安装Sublime Text 3可以通过以下步骤进行&#xff1a; 打开终端。 导入Sublime Text 3的GPG密钥&#xff1a; wget -qO- https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - 添加Sublime Text 3的存储库&#xff1a; …...

python调用阿里云短信配置

1. 新增资质和签名 # 访问地址&#xff1a; https://dysms.console.aliyun.com/domestic/text/qualification2. 静静等待几十分钟~~~ 3. 通过sdk去调用&#xff0c;查看有没有python的sdk https://next.api.aliyun.com/api/Dysmsapi/2017-05-25/SendSms?完整代码 # -*- cod…...

MySQL 8.0.13安装配置教程

写个博客记录一下&#xff0c;省得下次换设备换系统还要到处翻教程&#xff0c;直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件&#xff0c;并用编辑器写入如下数据 [mysqld] [client] port…...

【idea快捷键】idea开发java过程中常用的快捷键

含义win快捷键mac快捷键复制当前行或选定的代码块Ctrl DCommand D通过类名快速查找类Ctrl NCommand N通过文件名快速查找文件Ctrl Shift NCommand Shift N通过符号名称快速查找符号&#xff08;类、方法等&#xff09;Ctrl Alt Shift NCommand Shift O跳转到声明C…...

2024年腾讯云GPU云服务器配置价格表(内存/系统盘/地域)

腾讯云GPU服务器是提供GPU算力的弹性计算服务&#xff0c;腾讯云GPU服务器具有超强的并行计算能力&#xff0c;可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景&#xff0c;腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…...

重构数据访问层-优化数据访问的开发

重新整理了一下过去开发的框架&#xff0c;在准备开发新项目时候&#xff0c;重新整理了一下思路&#xff0c;感觉数据访问层还是很鸡肋。过去几年中&#xff0c;急于完成项目开发和交付&#xff0c;框架都是迭代过来的&#xff0c;虽然满足了开发需求&#xff0c;但是&#xf…...

云计算概述报告

以下是一篇论述类文章 文章目录 I. 云计算介绍&#xff08;1&#xff09;云计算基本概念&#xff08;2&#xff09;云计算基本特征 II. 云计算发展历程&#xff08;1&#xff09;云计算的起源&#xff08;2&#xff09;云计算的发展阶段 III. 云计算特点&#xff08;1&#xff…...

C++:线程库的使用

文章目录 Windows和Linux平台的线程线程构造函数模板参数包 最近发现C11的线程库还没有进行总结&#xff0c;因此本篇对于C11当中新增的线程库的一些基本用法进行总结 Windows和Linux平台的线程 在Linux平台下是存在一些原生的线程系统调用的&#xff0c;比如有pthread_creat…...

机器学习模型:决策树笔记

第一章&#xff1a;决策树原理 1-决策树算法概述_哔哩哔哩_bilibili 根节点的选择应该用哪个特征&#xff1f;接下来选什么&#xff1f;如何切分&#xff1f; 决策树判断顺序比较重要。可以使用信息增益、信息增益率、 在划分数据集前后信息发生的变化称为信息增益&#xff0c…...

20.2k stars项目搭建私人网盘界面美功能全

Nextcloud是一套用于创建网络硬盘的客户端&#xff0d;服务器软件。其功能与Dropbox相近&#xff0c;但Nextcloud是自由及开放源代码软件&#xff0c;每个人都可以在私人服务器上安装并执行它。 GitHub数据 20.2k stars561 watching3.2k forks 开源地址:https://github.com/ne…...

卷积篇 | YOLOv8改进之引入全维度动态卷积ODConv | 即插即用

前言:Hello大家好,我是小哥谈。ODConv是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法,一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度…...

Pytorch实用教程:torch.from_numpy(X_train)和torch.from_numpy(X_train).float()的区别

在PyTorch中&#xff0c;torch.from_numpy()函数和.float()方法被用来从NumPy数组创建张量&#xff0c;并可能改变张量的数据类型。两者之间的区别主要体现在数据类型的转换上&#xff1a; torch.from_numpy(X_train)&#xff1a;这行代码将NumPy数组X_train转换为一个PyTorch张…...

深度学习pytorch好用网站分享

深度学习在线实验室Featurizehttps://featurize.cn/而且这个网站里面还有一些学习教程 免费好用 如何使用 PyTorch 进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f...

C语言 | Leetcode C语言题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {struct ListNode *head NULL, *tail NULL;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val : 0;int n2 l2 ? l2->val : 0;int sum n1 n2 …...

Oracle基础

Oracle基础 Oracle&#xff0c;作为全球最大的数据库软件供应商&#xff0c;其数据库产品在企业级应用市场中占据了举足轻重的地位。Oracle数据库以高性能、高可用性、高安全性以及强大的数据管理能力赢得了广泛认可。本文旨在为读者提供Oracle数据库的基础知识&#xff0c;帮…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...