前言
人脸,指纹识别已经走进人们的生活,无疑这方便了人们的生活,也提高了安全和可靠性,所以作为未来的学习方向,我也来接触接触人脸识别(有不足之处请见谅😁)
项目选型
为什么选择 K210?
因为这款芯片有充足的开源资料足够支撑我们学习,并将文档也很友好
相关资料连接
使用说明 (Github): /sipeed/MF1-User-Manual
硬件原理图/数据手册: /shareURL/MAIX/HDK
固件/资源包资料下载: http://api./shareURL/MF_Module
Sipeed HardWare: /sipeed/Sipeed_HardWare
核心部分(K210)
主要根据MF 人脸识别模块通信串口协议(Hex版)进行编写程序,本次只是写了添加,删除和查询三个基础功能
使用到 串口2 进行通信(代码未贴,需要自行配置)
MF 人脸识别模块通信串口协议(Hex版)/sipeed/MF1-User-Manual/blob/master/zh_CN/p02_mf_protocol_manual_v2_hex_zh_CN.md
K210.h
/********************************************************************************** @Function: hr建立@TEL: Q1727606470@Others : 参考使用**********************************************************************************/#ifndef __H210_h#define __H210_h#include "stm32f10x.h"#include <string.h>#include <stdio.h>typedef struct {uint8_t Add_User; //添加用户指令uint8_t Delete_User;//删除用户指令uint8_t Check_User; //检测用户指令uint8_t Set_LED;//设置LED亮度}State_Flage_TypeDef;//模组返回的消息类型说明#define BINCMD_PING 0x00 // ping 指令#define BINCMD_ABORT0x01 // 中断当前执行指令#define BINCMD_INFO0x02 // 查询板卡信息#define BINCMD_BAUD 0x03 // 设置波特率#define BINCMD_RECORD 0x04 // 开始录入人脸#define BINCMD_CONFIRM 0x05 // 确认录入人脸#define BINCMD_DEL 0x06 // 删除指定 ID 人脸#define BINCMD_FR_RUN 0x07 // 开始/停止运行人脸识别#define BINCMD_FR_RES0x08 // 模块返回的人脸识别结果#define BINCMD_FR_GATE 0x09 // 设置人脸识别门限#define BINCMD_LED 0x0A // 设置LED灯状态#define BINCMD_FR_RUN2 0x0B // /********************************************************************************** @Function: 添加指定ID人脸* @Input: User_ID 用户id(0~254)* @Output: None * @Return: None* @Others: 未使用CRC16验证* @Date: -09-14**********************************************************************************/void H210_InputFaceID(u8 User_ID);/********************************************************************************** @Function: 删除指定ID* @Input: User_ID 用户id(0~254)* @Output: None * @Return: None* @Others: None* @Date: -09-14**********************************************************************************/void H210_ClearDate(u8 User_ID);/********************************************************************************** @Function: 检测人脸* @Input: None* @Output: None* @Return: None* @Others: 未使用CRC16验证* @Date: -09-14**********************************************************************************/void H210_CheckFacesID(void);#endif
K210.c
#include "k210.h"//k210使用的串口2#include "usart.h"#include "usart2.h" #include "delay.h"extern u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //获取接收消息extern vu16 USART2_RX_STA; State_Flage_TypeDef *State_Flage; //枚举一个状态值/********************************************************************************** @Function: 固定指令(程序中进行修改)**********************************************************************************/unsigned char H210_FaceStorageCmd[11] ={0x24,0x24,0x0B,0x00,0xFF,0xFF,0x04,0x00,0x00,0x05,0x01};//录入人脸,设置超时时间为 5 秒unsigned char H210_FaceOKCmd[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x05,0x01}; //确认录入成功unsigned char H210_CheckFaceID[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x07,0x01}; //开启人脸识别,设置仅上报id,可以观察到红外灯亮起unsigned char H210_CheckFaceIDMsg[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x07,0x02}; //开启人脸识别,设置上报id及特征值,可以观察到红外灯亮起unsigned char H210_CheckFaceNum[7] ={0x24,0x24,0x07,0x00,0xFF,0xFF,0x11}; //查询录入人数unsigned char H210_CheckFaceAllmsg[7] ={0x24,0x24,0x07,0x00,0xFF,0xFF,0x12}; //查询录入的所有信息unsigned char H210_DeleteFaceID[9] ={0x24,0x24,0x09,0x00,0xFF,0xFF,0x06,0x00,0xFF};//删除指定用户信息unsigned char H210_SetLEDLight[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x0A,0x80}; //删除指定用户信息/********************************************************************************** @Function: 设置LED亮度* @Input: User_ID 用户id(0~254)* @Output: None * @Return: None* @Others: None* @Date: -09-14**********************************************************************************/static void Clear_flage(void){//清空标志位State_Flage->Add_User =0; //添加人脸标志位State_Flage->Delete_User =0;//删除人脸标志位State_Flage->Check_User =0; //检测人脸标志位State_Flage->Set_LED =0;//设置LED亮度标志位H210_FaceStorageCmd[8]=0; //恢复人脸录入数}/********************************************************************************** @Function: 设置LED亮度* @Input: User_ID 用户id(0~254)* @Output: None * @Return: None* @Others: None* @Date: -09-14**********************************************************************************/static void Set_Light(u8 Light){State_Flage->Set_LED =1;H210_SetLEDLight[7] = Light;//修改LED亮度Usart_SendArray(USART2,(char*)H210_SetLEDLight,sizeof(H210_SetLEDLight));//发送录入指令}/********************************************************************************** @Function: 添加指定ID人脸* @Input: User_ID 用户id(0~254)* @Output: None * @Return: None* @Others: 未使用CRC16验证* @Date: -09-14**********************************************************************************/void H210_InputFaceID(u8 User_ID){State_Flage->Add_User =1;H210_FaceStorageCmd[7] = User_ID;//修改用户IDUsart_SendArray(USART2,(char*)H210_FaceStorageCmd,sizeof(H210_FaceStorageCmd));//发送录入指令}/********************************************************************************** @Function: 删除指定ID* @Input: User_ID 用户id(0~254)* @Output: None * @Return: None* @Others: 未使用CRC16验证* @Date: -09-14**********************************************************************************/void H210_ClearDate(u8 User_ID){State_Flage->Delete_User =1;H210_DeleteFaceID[7] = User_ID;//修改用户IDUsart_SendArray(USART2,(char*)H210_DeleteFaceID,sizeof(H210_DeleteFaceID));//发送删除指令}/********************************************************************************** @Function: 检测人脸* @Input: None* @Output: None* @Return: None* @Others: 未使用CRC16验证* @Date: -09-14**********************************************************************************/void H210_CheckFacesID(void){State_Flage->Check_User =1;Set_Light(90); //亮度设置(补光)Usart_SendArray(USART2,(char*)H210_CheckFaceID,sizeof(H210_CheckFaceID));//发送删除指令}/********************************************************************************** @Function: 循环检测是否符合指令* @Input: None* @Output: None * @Return: None* @Others: None* @Date: -09-14**********************************************************************************/void H210_CheckHex(void){if(USART2_RX_STA){if(State_Flage->Check_User){//检测用户if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x83){//40 40 08 00 83 CE 87 00 检测成功printf("用户ID: %d",USART2_RX_BUF[7]);//输出检测成功的用户IDClear_flage(); //清除标志位Set_Light(0); //关闭补光}}else if(State_Flage->Add_User){//添加用户if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x2A){//录入第一次人脸信息switch(H210_FaceStorageCmd[8]){case 0x00:H210_FaceStorageCmd[8]++;break;//开始录入第二次录入人脸信息case 0x01:H210_FaceStorageCmd[8]++;break;//开始录入第三次录入人脸信息case 0x02:H210_FaceStorageCmd[8]++;break;//超过我们限定(3)的录入次数(发送确认录入信息)}if(H210_FaceStorageCmd[8]>0x02){Usart_SendArray(USART2,(char*)H210_FaceOKCmd,sizeof(H210_FaceOKCmd));//确认录入指令Clear_flage(); //清除标志位}else{Usart_SendArray(USART2,(char*)H210_FaceStorageCmd,sizeof(H210_FaceStorageCmd));//发送录入指令}}}else if(State_Flage->Delete_User){//删除用户if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x5B){//40 40 08 00 5B D7 86 00 删除成功Clear_flage(); //清除标志位}}else if(State_Flage->Set_LED){//设置LED亮度if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0xFB){//40 40 08 00 5B D7 86 00 删除成功Clear_flage(); //清除标志位}}}}
人脸设别的STM32主要的代码块已贴