人脸,指纹识别已经走进人们的生活,无疑这方便了人们的生活,也提高了安全和可靠性,所以作为未来的学习方向,我也来接触接触人脸识别(有不足之处请见谅😁)

因为这款芯片有充足的开源资料足够支撑我们学习,并将文档也很友好

使用说明 (Github): github.com/sipeed/MF1-User-Manual
硬件原理图/数据手册: https://dl.sipeed.com/shareURL/MAIX/HDK
固件/资源包资料下载: http://api.dl.sipeed.com/shareURL/MF_Module
Sipeed HardWare: github.com/sipeed/Sipeed_HardWare
主要根据 MF 人脸识别模块通信串口协议(Hex版)进行编写程序,本次只是写了添加,删除和查询三个基础功能
使用到 串口2 进行通信(代码未贴,需要自行配置)
- /*********************************************************************************
- * @Function : hr建立
- @TEL : Q1727606470
- @Others : 参考使用
- **********************************************************************************/
- #ifndef __H210_h
- #define __H210_h
-
- #include "stm32f10x.h"
- #include
- #include
-
-
- 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_ABORT 0x01 // 中断当前执行指令
- #define BINCMD_INFO 0x02 // 查询板卡信息
- #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_RES 0x08 // 模块返回的人脸识别结果
- #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 : 2022-09-14
- **********************************************************************************/
- void H210_InputFaceID(u8 User_ID);
- /*********************************************************************************
- * @Function : 删除指定ID
- * @Input : User_ID 用户id(0~254)
- * @Output : None
- * @Return : None
- * @Others : None
- * @Date : 2022-09-14
- **********************************************************************************/
- void H210_ClearDate(u8 User_ID);
- /*********************************************************************************
- * @Function : 检测人脸
- * @Input : None
- * @Output : None
- * @Return : None
- * @Others : 未使用CRC16验证
- * @Date : 2022-09-14
- **********************************************************************************/
- void H210_CheckFacesID(void);
-
- #endif
-
- #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 : 2022-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 : 2022-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 : 2022-09-14
- **********************************************************************************/
- void H210_InputFaceID(u8 User_ID)
- {
- State_Flage->Add_User =1;
- H210_FaceStorageCmd[7] = User_ID;//修改用户ID
- Usart_SendArray(USART2,(char*)H210_FaceStorageCmd,sizeof(H210_FaceStorageCmd));//发送录入指令
- }
- /*********************************************************************************
- * @Function : 删除指定ID
- * @Input : User_ID 用户id(0~254)
- * @Output : None
- * @Return : None
- * @Others : 未使用CRC16验证
- * @Date : 2022-09-14
- **********************************************************************************/
- void H210_ClearDate(u8 User_ID)
- {
- State_Flage->Delete_User =1;
- H210_DeleteFaceID[7] = User_ID;//修改用户ID
- Usart_SendArray(USART2,(char*)H210_DeleteFaceID,sizeof(H210_DeleteFaceID));//发送删除指令
- }
- /*********************************************************************************
- * @Function : 检测人脸
- * @Input : None
- * @Output : None
- * @Return : None
- * @Others : 未使用CRC16验证
- * @Date : 2022-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 : 2022-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]);//输出检测成功的用户ID
- Clear_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主要的代码块已贴
