ESP32 实时人脸检测系统:ESP32 与上位机通信(microPython框架)
实时人脸检测系统:ESP32 与上位机通信
在这篇博客中,我将介绍如何使用 ESP32 摄像头捕获图像,并通过 UDP 协议将图像传输到上位机进行实时人脸检测。我们将使用 Python 编程语言和 OpenCV 库来实现上位机端的人脸检测功能。
硬件与软件准备
- ESP32 开发板:我们使用 ESP32 开发板和摄像头模块来捕获图像。
- 上位机:需要一台装有 Python 和 OpenCV 库的计算机作为上位机。
- WiFi 网络:确保 ESP32 和上位机连接到同一 WiFi 网络,以便它们之间能够进行通信。
ESP32 代码解析
在 ESP32 的代码中,我们首先初始化摄像头,并设置一些参数,如分辨率、特效、白平衡等。然后,我们创建一个 UDP socket,并持续地捕获图像并通过 UDP 发送到指定的 IP 地址和端口。下面是代码的关键部分:
# 连接wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():print('连接到网络...')wlan.connect('wifi账号', 'wifi密码')while not wlan.isconnected():pass
print('网络配置:', wlan.ifconfig())# 摄像头初始化
try:camera.init(0, format=camera.JPEG)
except Exception as e:camera.deinit()camera.init(0, format=camera.JPEG)# 创建 UDP socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)# 捕获图像并发送到指定地址
while True:buf = camera.capture()s.sendto(buf, ("192.168.3.5", 9090))time.sleep(0.1)
上位机代码解析
在上位机的代码中,我们创建一个 UDP socket,并监听指定端口。当收到来自 ESP32 的图像数据时,我们将其转换为 OpenCV 图像格式,并使用 Haar 特征级联分类器检测图像中的人脸。最后,我们在图像中绘制矩形框来标记检测到的人脸。下面是代码的关键部分:
# 加载用于人脸检测的预训练 Haar 特征级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')# 创建 UDP socket 并绑定端口
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.bind(("0.0.0.0", 9090))# 接收并处理来自 ESP32 的图像数据
while True:data, IP = s.recvfrom(100000)bytes_stream = io.BytesIO(data)image = Image.open(bytes_stream)img = np.asarray(image)img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)# 在图像中检测人脸faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 绘制矩形框标记人脸for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imshow("ESP32 捕获的图像", img)if cv2.waitKey(1) == ord("q"):breaks.close()
cv2.destroyAllWindows()
结论
一个简单的实时人脸检测系统,利用 ESP32 捕获图像并通过 WiFi 发送到上位机,然后在上位机中使用 OpenCV 对图像进行处理并实时显示人脸检测结果。项目地址 实时人脸检测系统:ESP32 与上位机通信
相关文章:
ESP32 实时人脸检测系统:ESP32 与上位机通信(microPython框架)
实时人脸检测系统:ESP32 与上位机通信 在这篇博客中,我将介绍如何使用 ESP32 摄像头捕获图像,并通过 UDP 协议将图像传输到上位机进行实时人脸检测。我们将使用 Python 编程语言和 OpenCV 库来实现上位机端的人脸检测功能。 硬件与软件准备…...
Paddle 0-d Tensor 使用指南
Paddle 0-d Tensor 使用指南 1. 0-d Tensor 的定义 在深度学习框架中,Tensor 是存储和操作数据的基本数据结构。一个 Tensor 可以有 0 到任意多的维度,每个维度对应一个 shape 值。而 0-d Tensor,顾名思义,就是一个无任何维度的 Tensor&…...
Collection(一)[集合体系]
说明:Collection代表单列集合,每个元素(数据)只包含一个值。 Collection集合体系: Collection<E> 接口 (一)List<E> 接口 说明:添加的元素是有序、可重复、有索引。 1. ArrayLi…...
58. 最后一个单词的长度
Show me the code class Solution {func lengthOfLastWord(_ s: String) -> Int {s.trimmingCharacters(in: .whitespacesAndNewlines).components(separatedBy: CharacterSet.whitespaces).last?.count ?? 0} }注意点 // print: ["", "", "&…...
深入理解ECMAScript:JavaScript的规范与实践
引言 在当今的Web开发领域,JavaScript几乎无处不在。它不仅在客户端编程中占据主导地位,而且在服务器端(Node.js)和移动应用开发中也越来越受欢迎。然而,JavaScript的核心并非由单一的公司或组织控制,而是…...
【深度学习】Transformer梳理
零、前言 对于transformer,网上的教程使用记号、术语不一 。 最关键的一点,网上各种图的简化程度不一 (画个图怎么能这么偷懒) ,所以我打算自己手画一次图。 看到的最和善(但是不是那么靠谱,我…...
C语言 | Leetcode C语言题解之第118题杨辉三角
题目: 题解: int** generate(int numRows, int* returnSize, int** returnColumnSizes) {int** ret malloc(sizeof(int*) * numRows);*returnSize numRows;*returnColumnSizes malloc(sizeof(int) * numRows);for (int i 0; i < numRows; i) {re…...
以太坊钱包
以太坊钱包是你通往以太坊系统的门户。它拥有你的密钥,并且可以代表你创建和广播交易。选择一个以太坊钱包可能很困难,因为有很多不同功能和设计选择。有些更适合初学者,有些更适合专家。即使你现在选择一个你喜欢的,你可能会决定…...
Vue 怎么定义插件以及使用这个插件
Vue.js插件是一种增强Vue功能的方式,它允许你向Vue中添加全局功能,比如全局方法、指令、过滤器、混入等 创建Vue插件 export default {install(Vue, options) {// 添加全局方法或属性Vue.myGlobalMethod function() {console.log(全局方法调用, optio…...
SQL2017附加从其他电脑复制过来的mdf数据后出现【只读】无法写入数据
1. 尝试给它所在的文件夹的属性中的“只读”去勾,无果。 2. 其他文章提示是文件的问题。 该错误为文件权限错误,找到该数据库的 数据库文件 和 日志文件,在安全中添加 Authenticated Users 用户的权限,并设置 “完全控制”...
Python轴承故障诊断 (21)基于VMD-CNN-BiTCN的创新诊断模型
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…...
如何运行大模型
简介 要想了解一个模型的效果,对模型进行一些评测,或去评估是否能解决业务问题时,首要任务是如何将模型跑起来。目前有较多方式运行模型,提供client或者http能力。 名词解释 浮点数表示法 一个浮点数通常由三部分组成…...
基于FPGA实现LED的闪烁——HLS
基于FPGA实现LED的闪烁——HLS 引言: 随着电子技术的飞速发展,硬件设计和开发的速度与效率成为了衡量一个项目成功与否的关键因素。在传统的硬件开发流程中,工程师通常需要使用VHDL或Verilog等硬件描述语言来编写底层的硬件逻辑࿰…...
平常心看待已发生的事
本篇主要记录自己在阅读此篇文章(文章链接: 这才是扼杀员工积极性的真正原因(管理者必读) )和这两天京东的东哥“凡是长期业绩不好,从来不拼搏的人,不是我的兄弟”观点后的一些想法。 自己在微…...
docker image分析利器之dive
dive是一个用于研究 Docker 镜像、层内容以及发现缩小 Docker/OCI 镜像大小方法的开源工具. 开源地址: dive github 为了有个直观的印象, 可以先看一下repo文档中的gif图: 安装 在Ubuntu/Debian系统下,可以使用deb包安装: DIVE_VERSION$(curl -sL "https:/…...
java组合设计模式Composite Pattern
组合设计模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。 // Component - 图形接口 interface Graphic {void draw()…...
每天五分钟深度学习:如何使用计算图来反向计算参数的导数?
本文重点 在上一个课程中,我们使用一个例子来计算函数J,也就相当于前向传播的过程,本节课程我们将学习如何使用计算图计算函数J的导数。相当于反向传播的过程。 计算J对v的导数,dJ/dv3 计算J对a的导数,dJ/da…...
常见排序算法之选择排序
目录 一、选择排序 1.1 什么是选择排序? 1.2 思路 1.2.1 思路一 1.2.2 优化思路 1.3 C语言源码 1.3.1 思路一 1.3.2 优化思路 二、堆排序 2.1 调整算法 2.1.2 向上调整算法 2.1.3 向下调整算法 2.2 建堆排序 一、选择排序 1.1 什么是选择排序…...
Redis 事件机制 - AE 抽象层
Redis 服务器是一个事件驱动程序,它主要处理如下两种事件: 文件事件:利用 I/O 复用机制,监听 Socket 等文件描述符上发生的事件。这类事件主要由客户端(或其他Redis 服务器)发送网络请求触发。时间事件&am…...
Java | Leetcode Java题解之第118题杨辉三角
题目: 题解: class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> ret new ArrayList<List<Integer>>();for (int i 0; i < numRows; i) {List<Integer> row new…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
