esp32cam门禁系统简易教程
esp32cam门禁系统简易教程(⼈脸识别)
1.环境安装(最好有梯⼦)(arduino IDE)
1.官⽹下载地址 选择相应版本下载Windows ZIP file ⽆脑安装
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 有⼀部分商家直接就有配置10C
M摄像头线的商品,买的时候询问⼀下,就可以省去延长线。
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 ="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;
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 = String();
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();
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.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");
// 摄像头配置资料来源:github/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_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
f 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_recognitionpare_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_recognitionpare_faces( ,,tolerance=0.4) 识别精度这个参数,数值越⼩,进度越⾼。实际拍摄的照⽚就不上传了,涉及个⼈和邻居的隐私。