esp32cam门禁系统简易教程

2023-11-19

esp32cam门禁系统简易教程(人脸识别)

1.环境安装(最好有梯子)(arduino IDE)

1.官网下载地址 选择相应版本下载Windows ZIP file 无脑安装

2.配置IDE,打开IDE,文件->首选项->附加开发板管理网址里填入 https://dl.espressif.com/dl/package_esp32_index.json

3.配置开发板,工具->开发板->管理开发板->搜索esp32->点击安装(这里需要梯子,没有的话需要去Github下载esp32的开发板软件直接安装),安装完成后关闭窗口,在开发板中选择 AI Thinker ESP32-CAM 这块板子

2.硬件(兼可从TB购买)

1.esp32-cam(带摄像头)(核心)

2.电源模块(usb转ttl,给ESP32供电)(我选择得是 cp2102 模块)

3.人体红外感应模块(用于信号输入)(我选择的是HC-SR501 RD-624 模块)

4.(可选)OV2640延长线(原生摄像头传输线太短)。注:esp32cam 有一部分商家直接就有配置10CM摄像头线的商品,买的时候询问一下,就可以省去延长线。

5.一个Linux系统的电脑(windows也可以,需要自行摸索)(我是旧电脑直接装了ubuntu桌面系统,这台电脑准备作为所有智能家居的核心,需要一直保持开机状态)

其余:杜邦线,开关,电阻,发光二极管,5V继电器模块……

注:照片传输速度完全取决于你将esp32的WIFI天线露出多少,如果你用面包板完全遮住了天线,就会非常卡……卡……卡,这也是我购买摄像头延长线的原因之一。

3.程序

功能描述

人靠近房门,红外感应装置向esp32发送指令,开始拍照,照片通过WIFI传送后端linux服务器(采用HTTP协议),由后端python程序进行人脸识别,并将开门指令返回esp32,收到开门指令后,接通5V中间继电器,由继电器控制的机械硬件打开门锁(房门),人进入后,红外感应装置失去目标,程序恢复等待状态。

在这里插入图片描述

代码

esp32cam代码:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "esp_camera.h"

// 下面四条要自行更改
const char *ssid = "6-18";                      // wifi名
const char *password = "123456";              // wifi密码
const char *host = "http://192.168.101.105:55363"; // 后端地址和端口
const char *query_addr = "/upload_picture";     // 后端接收图片的url
 
WiFiClient wifi_Client;
HTTPClient http_client;
String req;
String rsp;
int pushButton = 12;
int outputButton = 13;
// 烧录程序的时候这两个口不要通电,就是说先传代码,再接线,不然大概率传不进去

int state = 0;

//Wifi连接
void setupWifi()
{
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print(WiFi.localIP());
}
 
void setUpHttpClient()
{
  req = (String)host + query_addr;
  Serial.println(req);
  if (http_client.begin(req))
  {
    Serial.println("HTTPclient setUp done!");
  }
}

// 拍照发送并解析响应
void send_data() {
  //拍照,获取图像
  camera_fb_t * fb = esp_camera_fb_get();
 
  // 添加http头
  http_client.addHeader("Content-Type","image/jpg");
  // 发送请求
  Serial.println("发送照片");
  int http_code = http_client.POST((uint8_t*)fb->buf, fb->len);
  Serial.println("完成");
  // 解析响应
  if(http_code == 200) {
    rsp = http_client.getString();
    DynamicJsonDocument doc(1024);
    // json序列化
    deserializeJson(doc, rsp);
    JsonObject obj = doc.as<JsonObject>();
    // 获取响应数据,我的后端是python,django服务:return JsonResponse({'code': 200, 'data': '1'})
    if(obj["data"]=="1") {
      digitalWrite(outputButton, HIGH);
      Serial.println("验证成功,解锁");
      delay(2000);
      // 每次解锁2秒钟,因为我外接的机械解锁装置是电磁铁,吸合时间过长会烧毁
      digitalWrite(outputButton, LOW);
      }
  }
  //清空数据,释放内存,我也不知道这行代码到底有没有用
  esp_camera_fb_return(fb);
  }

void setup()
{
  Serial.begin(115200); // 指定波特率
  delay(3000);
  // 指定信号输入口和输出口
  pinMode(outputButton,OUTPUT);
  pinMode(pushButton,INPUT);
  
  setupWifi();
  Serial.print("WIFI OK");
  setUpHttpClient();

  camera_config_t config1;
  //config1.ledc_channel = 4;
  config1.pin_d0 = 5;
  config1.pin_d1 = 18;
  config1.pin_d2 = 19;
  config1.pin_d3 = 21;
  config1.pin_d4 = 36;
  config1.pin_d5 = 39;
  config1.pin_d6 = 34;
  config1.pin_d7 = 35;
  config1.pin_xclk = 0;
  config1.pin_pclk = 22;
  config1.pin_vsync = 25;
  config1.pin_href = 23;
  config1.pin_sscb_sda = 26;
  config1.pin_sscb_scl = 27;
  config1.pin_pwdn = 32;
  config1.pin_reset = 15;
  config1.xclk_freq_hz = 20000000;
  config1.pixel_format = PIXFORMAT_JPEG;
  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  if(psramFound()){
    config1.frame_size = FRAMESIZE_UXGA;
    config1.jpeg_quality = 10;
    config1.fb_count = 2;
  } else {
    config1.frame_size = FRAMESIZE_SVGA;
    config1.jpeg_quality = 12;
    config1.fb_count = 1;
  }


  // camera init
  esp_err_t err = esp_camera_init(&config1);//摄像头初始化
  if (err != ESP_OK) {//摄像头初始化失败,则打印消息并终止程序
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
  Serial.printf("camera is runing\n");
  // 摄像头配置 资料来源:https://github.com/espressif/esp32-camera/blob/master/driver/include/sensor.h
  sensor_t *s = esp_camera_sensor_get();//获取调整图像接口
  s->set_framesize(s, FRAMESIZE_VGA);//更改帧尺寸
  /*  set_framesize(s, )可选参数为:
    FRAMESIZE_96x96,    // 96x96
    FRAMESIZE_QQVGA,    // 160x120
    FRAMESIZE_QQVGA2,   // 128x160
    FRAMESIZE_QCIF,     // 176x144
    FRAMESIZE_HQVGA,    // 240x176
    FRAMESIZE_240x240,  // 240x240
    FRAMESIZE_QVGA,     // 320x240
    FRAMESIZE_CIF,      // 400x296
    FRAMESIZE_VGA,      // 640x480
    FRAMESIZE_SVGA,     // 800x600
    FRAMESIZE_XGA,      // 1024x768
    FRAMESIZE_SXGA,     // 1280x1024
    FRAMESIZE_UXGA,     // 1600x1200
    FRAMESIZE_QXGA,     // 2048*1536
    FRAMESIZE_INVALID
  */
  s->set_contrast(s, 2); // 对比度(-2,2),开高了效果好
  s->set_quality(s, 5); // 图像质量(0,63),数字越小质量越高,
  // 不要把质量设得太高,我实测每张照片超过60K就损坏了,官方示例最高只能到10
  s->set_ae_level(s, 1); // 曝光补偿(-2,2)
//  s->set_brightness(s, val); // 感光度(-2,2),可以减小光圈的大小,增加景深,但会增加噪点
//  s->set_saturation(s, val); // 饱和度(-2,2),默认的就挺好
//  s->set_hmirror(s, val); // 水平翻转
//  s->set_vflip(s, val); // 垂直翻转
//  s->set_awb_gain(s, val); // 自动白平衡,默认开启
//  s->set_whitebal(s, val); // 白平衡
//  s->set_aec_value(s, val); // 自动光圈,默认开启
//  s->set_aec2(s, val); // 包围曝光模式,轮流使用多种光圈进行曝光(欠曝,正常,过曝),自动光圈开启时,该选项无效
//  s->set_exposure_ctrl(s, val); 光圈大小(0,1200),自动光圈开启时,该选项无效
//  s->set_dcw(s, val); // 应该属于矫正
//  s->set_bpc(s, val); // 应该属于矫正
//  s->set_wpc(s, val); // 应该属于矫正
//  s->set_raw_gma(s, val); // 伽马矫正
//  s->set_lenc(s, val); // 镜头边缘矫正
//  s->set_special_effect(s, val); // 特殊效果?
//  s->set_agc_gain(s, val); // 增益(0,30),对暗环境有效,开着好?
//  s->set_gain_ctrl(s, val); // 增益开关?
//  s->set_gainceiling(s, (gainceiling_t)val); // 增益?
//  s->set_colorbar(s, val); // 色彩条,用来校准色彩

}
 
void loop() {
  // 不断获取信号输入口电平
  int buttonState = digitalRead(pushButton);
  if(buttonState == 1) {
    send_data();
    }
  delay(50);
}

如果编译时提示错误,缺少某个库,那么需要先安装:项目->加载库->管理库->搜索找到该库->安装

后端django程序:主要使用python3.6,face_recognition库

import time
import os

from django.http import JsonResponse
from django.conf import settings

import cv2
import numpy as np
import face_recognition

# 读取家庭成员面部信息
home_face_list = [face_recognition.face_encodings(
    cv2.imread(f'{settings.BASE_DIR}/esp32cam/home/{file_name}'), model='cnn')[0]
     for file_name in os.listdir(f'{settings.BASE_DIR}/esp32cam/home')]


def upload_picture(request):
    # 接收esp32发来的照片
    data = request.body
    # 将二进制照片,转化为numpy数组,这是非常快的一种转换方式
    img = cv2.imdecode(np.fromstring(data, np.uint8), 1)
    try:
    	 # 提取上传图片的人脸信息
        img_face = face_recognition.face_encodings(img, model='cnn')[0]
    except IndexError:
        print('未检测到人脸')
        return JsonResponse({'code': 200, 'data': '0'})
	# 将接收的人脸与家庭成员人脸数组对比,返回:[True or False,True or False,……]
    activr_list = face_recognition.compare_faces(home_face_list, img_face, tolerance=0.4)
    if True in active_list:
    	# 如果想要将对比成功的照片保存进磁盘,建议使用消息队列,使用该线程保存照片会消耗大量时间
    	# ,导致开门延时增加
        return JsonResponse({'code': 200, 'data': '1'})
    return JsonResponse({'code': 200, 'data': '0'})

测试结果:

esp32cam的拍照能力比较弱,照片大多比较模糊,特别是晚上的时候,为了对模糊照片进行较精准的识别,需要在后端调用 face_recognition.face_encodings(img, model=‘cnn’) 时加入 model=‘cnn’ 的参数,还需要手动设置 face_recognition.compare_faces( ,,tolerance=0.4) 识别精度这个参数,数值越小,进度越高。实际拍摄的照片就不上传了,涉及个人和邻居的隐私。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

esp32cam门禁系统简易教程 的相关文章

  • (discord.py) 尝试更改成员角色时,“用户”对象没有属性“角色”

    因此 我正在尝试编写一个机器人 让某人在命令中指定的主持人指定的一段时间内暂停角色 我知道该变量称为 小时 即使它目前以秒为单位 我稍后会解决这个问题 基本上 它是由主持人在消息 暂停 personmention numberofhours
  • 使用Python开发Web应用程序

    我一直在用 python 做一些工作 但这都是针对独立应用程序的 我很想知道 python 的任何分支是否支持 Web 开发 有人还会建议一个好的教程或网站吗 我可以从中学习一些使用 python 进行 Web 开发的基础知识 既然大家都说
  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐