如何运行示例
您可使用开发板上的 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做为帧的输入流传入即可。