【ESP32学习笔记】#功能篇#(2)人脸识别(ESP32-CAM),网页查看,微信小程序管理

一、资料

  • ESP-WHO:人脸检测与识别框架
  • 图像建议分辨率为 QVGA(320x240)
  • 支持的摄像头:OV2640OV3660OV5640
  • 支持的 IDF 版本:v3.3.1v4.0.0
  • ESP-IDF 编程指南 V4.0 版本

二、获取ESP-WHO框架

git clone --recursive https://github.com/espressif/esp-who.git 

github 拉取代码可能很慢,而且经常会失败。
如果子模块拉取失败,请参考:【ESP32】加快esp-idf下载速度最新方法记录


三、设置环境变量

参考:ESP32学习笔记(2)——Linux下ESP32开发环境搭建

# 编辑环境变量
vim ~/.bashrc

# 加入路径
export IDF_PATH=~/ESP32/esp-who/esp-idf
export SOLUTION_PATH=~/ESP32/esp-who	# 配置这个环境变量后可以在任意目录编译项目

# 环境变量生效
source ~/.bashrc

四、使用已有的 ESP-IDF

注:建议直接使用 ESP-WHO 里面指向的分支,使用其他分支可能会有冲突。
如果已经有 ESP-IDF ,需要切换到 v3.3.1 或者 v4.0.0 版本:
切换分支:

git checkout release/v4.0
cd ~/ESP32/tools/esp-gitee-tools
./submodule-update.sh ~/ESP32/esp-idf

或者再另建一个文件夹放 v4.0.0 的版本:

mkdir ~/ESP32&&mkdir ~/ESP32/tools&&cd ~/ESP32/tools
git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git
cd ..
git clone -b release/v4.0 https://gitee.com/EspressifSystems/esp-idf.git esp-idf_v4.0
cd ~/ESP32/tools/esp-gitee-tools
./submodule-update.sh ~/ESP32/esp-idf_v4.0
vim ~/.bashrc
export IDF_PATH=~/ESP32/esp-idf_v4.0
source ~/.bashrc

五、配置

使用 esp-who/examples/single_chip/camera_web_server 示例:

make menuconfig
Camera Web Server  --->
	WiFi Settings  --->		# WIFI相关配置
	LED Illuminator  --->	# 补光灯设置
		[ ] LED Illuminator Enabled
	Camera Pins  --->		# 摄像头引脚配置
		Select Camera Pinout (ESP32-CAM by AI-Thinker)  --->	# 使用的 ESP32-CAM  开发板
	[*] ESP-WHO Face Detection	# 人脸检测开启
	[*]   ESP-WHO Face Recognition	# 人脸识别开启

WIFI相关设置:

WiFi Settings  --->
	()  Camera Host Name
	()  WiFi STA SSID
	()  WiFi STA Password
	(ESP32-Camera) WiFi AP SSID
	()  WiFi AP Password
	(1) Maximal STA connections
	()  WiFi AP Channel
	(192.168.4.1) WiFi AP IP Address
	(5) Maximum retry

六、测试

连接名为 ESP32-Camera 的WIFI,然后浏览器输入 192.168.4.1 ,最好用谷歌浏览器。
在这里插入图片描述

人脸检测和人脸识别会占用大量内存,不能使用大分辨率,把分辨率设置为 QVGA(320x240)
在这里插入图片描述
打开 Face Detection 即可实现人脸检测,打开 Face Recognition 实现人脸识别,点击 Enroll Face 采集人脸。
在这里插入图片描述
H-Mirror V-Flip 调节图像方向。
在这里插入图片描述
LED Intensity 调节补光灯的亮度。
在这里插入图片描述

总体来说还算流畅。但是打开人脸检测和人脸识别后会变得很卡。
另外使用过程中会大量发热,建议加个散热片~~~


七、微信小程序管理人脸数据

1、编译微信小程序对应的示例工程

esp-who/examples/single_chip/face_recognition_wechat 示例:

这个示例没有引脚配置,默认使用的 ESP_EYE 开发板的引脚配置。
app_camera.h修改引脚如下(ESP32-CAM):

// CONFIG_CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

修改 app_camera.capp_camera_init 如下:

void app_camera_init()
{
    
    
#if CONFIG_CAMERA_MODEL_ESP_EYE    
    /* IO13, IO14 is designed for JTAG by default,
     * to use it as generalized input,
     * firstly declair it as pullup input */
    gpio_config_t conf;
    conf.mode = GPIO_MODE_INPUT;
    conf.pull_up_en = GPIO_PULLUP_ENABLE;
    conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
    conf.intr_type = GPIO_INTR_DISABLE;
    conf.pin_bit_mask = 1LL << 13;
    gpio_config(&conf);
    conf.pin_bit_mask = 1LL << 14;
    gpio_config(&conf);
#endif
    camera_config_t config;
    config.ledc_channel = LEDC_CHANNEL_0;
    config.ledc_timer = LEDC_TIMER_0;
    config.pin_d0 = Y2_GPIO_NUM;
    config.pin_d1 = Y3_GPIO_NUM;
    config.pin_d2 = Y4_GPIO_NUM;
    config.pin_d3 = Y5_GPIO_NUM;
    config.pin_d4 = Y6_GPIO_NUM;
    config.pin_d5 = Y7_GPIO_NUM;
    config.pin_d6 = Y8_GPIO_NUM;
    config.pin_d7 = Y9_GPIO_NUM;
    config.pin_xclk = XCLK_GPIO_NUM;
    config.pin_pclk = PCLK_GPIO_NUM;
    config.pin_vsync = VSYNC_GPIO_NUM;
    config.pin_href = HREF_GPIO_NUM;
    config.pin_sscb_sda = SIOD_GPIO_NUM;
    config.pin_sscb_scl = SIOC_GPIO_NUM;
    config.pin_reset = RESET_GPIO_NUM;
    config.pin_pwdn = PWDN_GPIO_NUM;
    config.xclk_freq_hz = XCLK_FREQ;
    config.pixel_format = CAMERA_PIXEL_FORMAT;
    config.frame_size = CAMERA_FRAME_SIZE;
    config.jpeg_quality = 10;
    config.fb_count = 1;    // 2

    // camera init
    esp_err_t err = esp_camera_init(&config);
    if (err != ESP_OK) {
    
    
        ESP_LOGE(TAG, "Camera init failed with error 0x%x", err);
        return;
    }

    sensor_t *s = esp_camera_sensor_get();
    s->set_vflip(s, 1);       //flip it back
    //initial sensors are flipped vertically and colors are a bit saturated
    if (s->id.PID == OV3660_PID)
    {
    
    
        s->set_brightness(s, 1);  //up the blightness just a bit
        s->set_saturation(s, -2); //lower the saturation
    }
}

2、进入小程序配置设备

乐鑫科技|ESP EYE 微信小程序上线!
在这里插入图片描述
+ 会自动配网:
在这里插入图片描述

在这里插入图片描述

  • 点击【人脸检测】,可以通过摄像头检测人脸。
  • 选中【人脸识别】,再点击【录入人脸】 输入和自定义人脸 ID,即可以完成 “人脸识别”。
  • 当开发板检测到无法识别的人脸时,屏幕上显示的不是一个已知的 ID,而是 WHO?
  • ESP EYE 小程序支持通过 “人脸 ID 管理” 功能输入多个人脸 ID。用户可以查看 ID 记录并删除任何 ID,或者在一次单击后清除所有的 ID。

3、问题解决

问题1:

E (1735) camera: Detected camera not supported.
E (1735) camera: Camera probe failed with error 0x20004
E (1735) app_camera: Camera init failed with error 0x20004

解决:
没有配置引脚导致的,按照上面的配置好引脚就没问题了。


问题2:

W (12405) httpd_parse: parse_block: request URI/header too long
W (12405) httpd_txrx: httpd_resp_send_err: 431 Request Header Fields Too Large - Header fields are too long for server to interpret

解决:
如下 配置最大HTTP请求头长度修改为 1024 就可以了。

Component config  --->
	HTTP Server  --->
		(1024) Max HTTP Request Header Length	// 默认是 512

参考:esp32 header fields are too long issue

猜你喜欢

转载自blog.csdn.net/p1279030826/article/details/119712796