human_face_recognition(AI开发框架esp-who)

如何运行示例

您可使用开发板上的 Boot 键交互。
● 短按 Boot 键:识别摄像头实时拍到的人脸。
● 长按 Boot 键:录入摄像头实时拍到的人脸。
● 双击 Boot 键:删除最后一个录入的人脸。

Terminal

示例代码
#include "who_camera.h"
#include "who_human_face_recognition.hpp"
#include "who_button.h"
#include "event_logic.hpp"
#include "who_adc_button.h"

static QueueHandle_t xQueueAIFrame = NULL;
static QueueHandle_t xQueueKeyState = NULL;
static QueueHandle_t xQueueEventLogic = NULL;
static button_adc_config_t buttons[4] = {{1, 2800, 3000}, {2, 2250, 2450}, {3, 300, 500}, {4, 850, 1050}};

#define GPIO_BOOT GPIO_NUM_0

extern "C" void app_main()
{
    xQueueAIFrame = xQueueCreate(2, sizeof(camera_fb_t *));
    xQueueKeyState = xQueueCreate(1, sizeof(int *));
    xQueueEventLogic = xQueueCreate(1, sizeof(int *));

    register_button(GPIO_BOOT, xQueueKeyState);
    register_camera(PIXFORMAT_RGB565, FRAMESIZE_240X240, 2, xQueueAIFrame);
    register_event(xQueueKeyState, xQueueEventLogic);
    register_human_face_recognition(xQueueAIFrame, xQueueEventLogic, NULL, NULL, true);

}
#include <stdio.h>
#include "event_logic.hpp"
#include "who_button.h"
#include "who_human_face_recognition.hpp"

typedef enum
{
    MENU = 1,
    PLAY,
    UP,
    DOWN
}key_name_t;

static QueueHandle_t xQueueKeyStateI = NULL;
static QueueHandle_t xQueueEventO = NULL;
static key_state_t key_state;
static key_name_t adc_button_name;
static recognizer_state_t recognizer_state;

void event_generate(void *arg)
{
    while (1)
    {
        // #include “FreeRTOS.h”
        // #include “queue.h”
        // BaseType_t xQueueReceive( QueueHandle_t xQueue,     队列的一个句柄
                                // void *pvBuffer,             一个指向接收到的数据将被复制到其中的内存的指针。
                                // TickType_t xTicksToWait );  任务等待时间
                                //从队列中接收(读取)一个项目。
        xQueueReceive(xQueueKeyStateI, &key_state, portMAX_DELAY);
        // typedef enum
        // {
        //     KEY_SHORT_PRESS = 1,
        //     KEY_LONG_PRESS,
        //     KEY_DOUBLE_CLICK,
        // } key_state_t;
        switch (key_state)
        {
        case KEY_SHORT_PRESS:
            recognizer_state = RECOGNIZE;
            break;

        case KEY_LONG_PRESS:
            recognizer_state = ENROLL;
            break;

        case KEY_DOUBLE_CLICK:
            recognizer_state = DELETE;
            break;

        default:
            recognizer_state = DETECT;
            break;
        }

        // #include “FreeRTOS.h”
        // #include “queue.h”
        // BaseType_t xQueueSend( QueueHandle_t xQueue,        队列的句柄
        //                         const void * pvItemToQueue, 要发送到队列的每一项
        //                         TickType_t xTicksToWait );  任务执行要等待的时间
        //发送(写入)一个项目到队列的前面或后面。

        xQueueSend(xQueueEventO, &recognizer_state, portMAX_DELAY);
    }
}


void event_generate_from_adc_button(void *arg)
{
    while (1)
    {
        xQueueReceive(xQueueKeyStateI, &adc_button_name, portMAX_DELAY);
        switch (adc_button_name)
        {
        case MENU:
            recognizer_state = ENROLL;
            break;

        case PLAY:
            recognizer_state = DELETE;
            break;

        case UP:
            recognizer_state = RECOGNIZE;
            break;

        case DOWN:
            recognizer_state = RECOGNIZE;
            break;

        default:
            recognizer_state = DETECT;
            break;
        }
        xQueueSend(xQueueEventO, &recognizer_state, portMAX_DELAY);
    }
}

void register_event(const QueueHandle_t key_state_i, const QueueHandle_t event_o)
{
    xQueueKeyStateI = key_state_i;
    xQueueEventO = event_o;
    // BaseType_t xTaskCreatePinnedToCore(TaskFunction_t pvTaskCode, 指向创建的任务的指针
    //                                     const char *const pc-Name, 给创建的任务起一个名称
    //                                     const uint32_t usStackDepth,  创建的任务的堆栈大小
                                        //    void *const pvPa-rameters,    要传入的参数
    //                                     UBaseType_t uxPriority,           任务的优先级
    //                                     TaskHandle_t *const pvCreatedTask, 返回一个任务的句柄
    //                                     const BaseType_t xCoreID)        
    xTaskCreatePinnedToCore(event_generate, "event_logic_task", 1024, NULL, 5, NULL, 0);
}
#pragma once

#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"

/**
 * @brief 
 * 
 * @param key_state_i 
 * @param event_o 
 */
void register_event(const QueueHandle_t key_state_i, const QueueHandle_t event_o);

在这里插入图片描述
摄像头获取到数据后通过register_camera()函数输出到xQueueAIFrame队列缓冲区中。BOOT按键的状态的不同也会触发不同的事件,通过register_button()的函数将BOOT按键的状态输出到xQueueKeyState按键的状态队列缓冲区里,再通过register_event()函数输出一个事件队列xQueueEventLogic,最后通过register_human_face_recognition()函数将xQueueAIFrame作为帧输入流传入 xQueueEventLogic传入一个事件队列,帧的输出流设置为NULL,结果将显示在终端上。

运行效果

在这里插入图片描述

LCD

示例代码
#include <stdio.h>
#include "event_logic.hpp"
#include "who_button.h"
#include "who_human_face_recognition.hpp"

typedef enum
{
    MENU = 1,
    PLAY,
    UP,
    DOWN
}key_name_t;

static QueueHandle_t xQueueKeyStateI = NULL;
static QueueHandle_t xQueueEventO = NULL;
static key_state_t key_state;
static key_name_t adc_button_name;
static recognizer_state_t recognizer_state;

void event_generate(void *arg)
{
    while (1)
    {
        xQueueReceive(xQueueKeyStateI, &key_state, portMAX_DELAY);
        switch (key_state)
        {
        case KEY_SHORT_PRESS:
            recognizer_state = RECOGNIZE;
            break;

        case KEY_LONG_PRESS:
            recognizer_state = ENROLL;
            break;

        case KEY_DOUBLE_CLICK:
            recognizer_state = DELETE;
            break;

        default:
            recognizer_state = DETECT;
            break;
        }
        xQueueSend(xQueueEventO, &recognizer_state, portMAX_DELAY);
    }
}


void event_generate_from_adc_button(void *arg)
{
    while (1)
    {
        xQueueReceive(xQueueKeyStateI, &adc_button_name, portMAX_DELAY);
        switch (adc_button_name)
        {
        case MENU:
            recognizer_state = ENROLL;
            break;

        case PLAY:
            recognizer_state = DELETE;
            break;

        case UP:
            recognizer_state = RECOGNIZE;
            break;

        case DOWN:
            recognizer_state = RECOGNIZE;
            break;

        default:
            recognizer_state = DETECT;
            break;
        }
        xQueueSend(xQueueEventO, &recognizer_state, portMAX_DELAY);
    }
}

void register_event(const QueueHandle_t key_state_i, const QueueHandle_t event_o)
{
    xQueueKeyStateI = key_state_i;
    xQueueEventO = event_o;
    xTaskCreatePinnedToCore(event_generate, "event_logic_task", 1024, NULL, 5, NULL, 0);
}
#pragma once

#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"

/**
 * @brief 
 * 
 * @param key_state_i 
 * @param event_o 
 */
void register_event(const QueueHandle_t key_state_i, const QueueHandle_t event_o);
#include "who_camera.h"
#include "who_human_face_recognition.hpp"
#include "who_lcd.h"
#include "who_button.h"
#include "event_logic.hpp"
#include "who_adc_button.h"

static QueueHandle_t xQueueAIFrame = NULL;
static QueueHandle_t xQueueLCDFrame = NULL;
static QueueHandle_t xQueueKeyState = NULL;
static QueueHandle_t xQueueEventLogic = NULL;
static button_adc_config_t buttons[4] = {{1, 2800, 3000}, {2, 2250, 2450}, {3, 300, 500}, {4, 850, 1050}};

#define GPIO_BOOT GPIO_NUM_0

extern "C" void app_main()
{
    xQueueAIFrame = xQueueCreate(2, sizeof(camera_fb_t *));
    xQueueLCDFrame = xQueueCreate(2, sizeof(camera_fb_t *));
    xQueueKeyState = xQueueCreate(1, sizeof(int *));
    xQueueEventLogic = xQueueCreate(1, sizeof(int *));

    register_button(GPIO_BOOT, xQueueKeyState);
    register_camera(PIXFORMAT_RGB565, FRAMESIZE_240X240, 2, xQueueAIFrame);
    // register_adc_button(buttons, 4, xQueueKeyState);
    register_event(xQueueKeyState, xQueueEventLogic);
    register_human_face_recognition(xQueueAIFrame, xQueueEventLogic, NULL, xQueueLCDFrame, false);
    register_lcd(xQueueLCDFrame, NULL, true);

}

在这里插入图片描述
如何将每一帧输出到LCD屏幕上呢?
在调用register_human_face_recognition()函数时,将帧的输出流的位置设置为xQueueLCDFrame,之后调用register_lcd()将xQueueLCDFrame做为帧的输入流传入即可。

运行效果

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_45671732

你们鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值