菜单

人脸识别驱动

下载

介绍

  人脸识别模块使用的是易胜公司提供的人脸识别模块。识别速度快,识别效率高。利用该模块,用户可以实现基本的用户注册、用户登录、照片上传以及数据下传的功能。以下为具体功能及使用方法的介绍。

使用方法

创建工程


  目前人脸识别模块只适用于自定义分辨率型号,大小为800*1280。选择完成后,选择 下一步 直至工程创建完成即可。

加入驱动

添加设备

  右键 设备管理 进行添加,下拉框中选择 其他,进而选择 人脸识别模块

  点击 下一步 直至模块选择完毕

HMI 设置

  人脸识别模块在模拟器中是不生效的,因此我们只需要对 HMI 进行配置即可,按照如下内容对串口进行设置即可

  至此,配置已全部设置完毕。下面将进行 API 讲解及使用方式。

类型介绍

总体介绍

使用类型

  所有的使用方法如下所示

c++ 复制代码
class EASENCODE{
public:
  enum {
     /** 停止并清除所有正在处理的消息,进入待机模式 */
     MID_RESET					=	0x10,
     /** ping 模块并获取状态 */
     MID_GETSTATUS				=	0x11,
     /** 验证摄像头前的人 */
     MID_VERIFY					=	0x12,
     /** 拍照并保存 */
     MID_SNAPIMAGE				=	0x16,
     /** 获取已保存图像的大小 */
     MID_GETSAVEDIMAGE			=	0x17,
     /** 上传图像 */
     MID_UPLOADIMAGE			=	0x18,
     /** 注册(可重复注册) */
     MID_ENROLL_SINGLE			=	0x1D,
     /** 删除指定用户 */
     MID_DELUSER				=	0x20,
     /** 删除所有注册用户 */
     MID_DELALL					=	0x21,
     /** 获取用户信息 */
     MID_GETUSERINFO			=	0x22,
     /** 重置人脸状态 */
     MID_FACERESET				=	0x23,
     /** 获取所有用户 ID */
     MID_GET_ALL_USERID			=	0x24,
     /** 初始化加密通信 */
     MID_INIT_ENCRYPTION		=	0x50,
     /** 准备关机 */
     MID_POWERDOWN				=	0xED,
     /** 注册(不允许重复注册) */
     MID_ENROLL_ITG				=	0x26,
     /** 上传图片信息注册包及注册 */
     MID_TRANS_FILE_PACKET		=	0x90
  };
};

返回状态

  获得的返回状态如下

c++ 复制代码
class EASENREPLY{
public:
  enum {
    /**成功*/
    MR_SUCCESS                =	0,
    /**模块拒绝该命令*/
    MR_REJECTED					= 	1,
    /**算法被中止*/
    MR_ABORTED					= 	2,
    /**摄像头打开失败*/
    MR_FAILED4_CAMERA			=	4,
    /**未知错误*/
    MR_FAILED4_UNKNOWNREASON	=	5,
    /**无效参数*/
    MR_FAILED4_INVALIDPARAM		=	6,
    /**内存不足*/
    MR_FAILED4_NOMEMORY			=	7,
    /**没有用户登记*/
    MR_FAILED4_UNKNOWNUSER		=	8,
    /**超过最大用户数量*/
    MR_FAILED4_MAXUSER			=	9,
    /**该人脸已被登记*/
    MR_FAILED4_FACEENROLLED		=	10,
    /**活体检测失败*/
    MR_FAILED4_LIVENESSCHECK	=	12,
    /**超过时间限制*/
    MR_FAILED4_TIMEOUT			=	13,
    /**授权失败*/
    MR_FAILED4_AUTHORIZATION	=	14,
    /**摄像头视场测试失败*/
    MR_FAILED4_CAMERAFOV		=	15,
    /**摄像头质量测试失败*/
    MR_FAILED4_CAMERAQUA		=	16,
    /**摄像头结构测试失败*/
    MR_FAILED4_CAMERASTRU		=	17,
    /**启动超时*/
    MR_FAILED4_BOOT_TIMEOUT		=	18,
    /**读取文件失败*/
    MR_FAILED4_READ_FILE		=	19,
    /**写入文件失败*/
    MR_FAILED4_WRITE_FILE		=	20,
    /**必须设置加密*/
    MR_FAILED4_NO_ENCRYPT		=	21

  };
};

重点介绍

MID_RESET

  重置模块。将正在进行的流程进行中断,返回原始状态。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("模块重置",1,true);

MID_GETSTATUS

  获取当前的模块状态。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("模块获取",1,true);

返回类型如下:

json 复制代码
模组的状态包括:
0: MS_STANDBY(模组处于空闲状态,等待主控命令)
1: MS_BUSY(模组处于工作状态)
2: MS_ERROR(模组出错,不能正常工作)
3: MS_INVALID(模组未进行初始化)
4: MS_OTA(OTA 升级中)

MID_VERIFY

  对传入用户进行验证。返回用户唯一ID以及是否为管理员1-管理员 0-非管理员)。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("验证",1,true);

MID_ENROLL_SINGLE/MID_ENROLL_ITG

  对用户进行注册(可重复注册)。传入的类型为string字符串,调用方法如下:

c++ 复制代码
// 这样设置表示 当前注册的用户为zhangsan 给他设置为1-管理员 0-非管理员
vm->setChar("可重复注册","zhangsan1",true);
// 也可以这样设置 不加姓名 设置为1-管理员 0-非管理员
vm->setChar("可重复注册","1",true);

MID_DELUSER

  删除单个用户。 需要先获取用户 ID ,再进行删除。传入的类型为int,调用方法如下:

c++ 复制代码
int userid = 1;//先获取当前用户id
vm->setInt("删除用户",userid,true);

MID_DELALL

  删除全部已注册用户。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("删除全部用户",1,true);

MID_GETUSERINFO

  获取用户信息。 需要先获取用户 ID ,再进行获取。传入的类型为int,调用方法如下:

c++ 复制代码
int userid = 1;//先获取当前用户id
vm->setInt("获取用户信息",userid,true);

MID_FACERESET

  清除正在录入的状态。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("清除状态",1,true);

MID_POWERDOWN

  关机指令。 特别注意:在执行完所有操作之后 需要使用该命令进行关机,直接断电模块将会损坏使用寿命,降低使用年限 。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("关机",1,true);

MID_SNAPIMAGE

  截图指令,在识别过程中进行截图,图片为IR红外图片,注意:调用该命令后需要调用MID_GETSAVEDIMAGE才能完成截图。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("截图",1,true);

MID_GETSAVEDIMAGE

  保存图片。该指令可以和MID_SNAPIMAGE配合使用,也可以单独使用。配合使用的时候图片为IR黑白图片,单独使用时在光线充足时为RGB彩色图片,在光线不足时为IR黑白图片。在该指令执行成功后,会自动调用MID_UPLOADIMAGE,将图片保存在指定的路径下,为jpg格式图片。图片保存的过程中,需要进行等待(约 5s 内),等待期间不可进行其他操作。传入的类型为string字符串,为保存图片的路径。路径文件夹必须存在,调用方法如下:

c++ 复制代码
string path = "/customer/prm/images/a.jpg";
vm->setChar("保存图片",path,true);

MID_TRANS_FILE_PACKET

  下传图片数据并注册用户(普通用户)。需要将jpg图片,通过易胜提供的工具转化为.bin的数据文件(可在技术支持群中向我们获取),传入.bin的数据文件,上传成功即注册成功,后续可以对其进行验证等其他操作。传入的类型为string字符串,为保存图片数据的路径。调用方法如下:

c++ 复制代码
string path = "/customer/prm/images/a.jpg.bin";
vm->setChar("下传图片",path,true);

  至此,重点函数已全部介绍完毕。

类型统计

数据类型如下表所示:

名称 类型
MID_RESET,MID_GETSTATUS,MID_VERIFY,MID_DELALL,MID_FACERESET,MID_POWERDOWN bool
MID_ENROLL_SINGLE,MID_ENROLL_ITG,MID_GETSAVEDIMAGE,MID_TRANS_FILE_PACKET 字符串
MID_GETUSERINFO,MID_DELUSER int

返回值

  本驱动封装了两种返回值,一个是NID_READY1,表示是在模块上电时的返回。一个是REPLY_STATUS,就是各种指令返回的组合值,下面是具体介绍:

NID_READY1

  根据人脸识别文档指示

在上位机处于休眠模式前,请将串口两个引脚模式配置成输出低电平模式。

  因此,我们需要在使用模块的时候 手动开启/关闭 gpio ,在使用页面onLoad函数中打开 gpio,在页面析构中关闭 gpio。

c++ 复制代码
//开启gpio
void Frm05::onLoad() {
  GPIO::setup(14);
  string s = "out";
  GPIO::setDirection(14, s);
  GPIO::setValue(14, 1);
}
// 关闭gpio
Frm05::~Frm05() {
  GPIO::setup(14);
  string s = "out";
  GPIO::setDirection(14, s);
  GPIO::setValue(14, 0);
}

  在上电时,模块会发送上电指令。我们只需要直接获取指令结果,从而获取模块是否上电成功的状态。

c++ 复制代码
int r;
vm->getInt("注册标志", r,true);

上电成功后,即可进行接下来的操作。

REPLY_STATUS

REPLY_STATUS 分为三个组成部分。我们将通过以下代码对此进行讲解

c++ 复制代码
/**
 * getStatus 0 上电时标准置零状态 不代表任何模式 uint8_t类型
高24位
 * 0x10 MID_RESET
 * 0x11 MID_GETSTATUS
 * 0x12 MID_VERIFY
 * 0x1D MID_ENROLL_SINGLE
 * 0x20 MID_DELUSER
 * 0x21 MID_DELALL
 * 0x22 MID_GETUSERINFO
 * 0x23 MID_FACERESET
 * 0xED MID_POWERDOWN ...
 *
 * dSignal 在MID_VERIFY MID_GETUSERINFO 为是否为管理员用户 检测成功的管理员用户是0x00(否) 0x01(是) 失败的是0x09
 * 其他的情况 如果是0x00 表示成功 其他的参数可以对应返回的各类参数进行判断 uint8_t类型 高16位
 *
 * other 在MID_VERIFY MID_ENROLL_SINGLE MID_GETUSERINFO为用户id 其他的作为保留参数 默认为0 uint16_t类型 低16位
 */
long long reply;
vm->getLong("返回内容",reply);
int getStatus = (reply >> 24) & 0xFF;
printf("getStatus=======%02x\n",getStatus);
int dSignal = (reply >> 16) & 0xFF;
printf("dSignal=======%02x\n",dSignal);
int other = reply & 0xFFFF;
printf("other=======%02x\n",other);

对于以上代码,有如下总结:

  • getStatus 表示为 原指令码

  • MID_RESETMID_DELUSERMID_DELALLMID_FACERESETMID_POWERDOWNMID_SNAPIMAGEMID_UPLOADIMAGE。dSignal 仅表示 为指令 返回的状态other 仅为预留位不做任何值

  • MID_UPLOADIMAGEdSignal0x00 时表示 图片下载成功0x01 为图片下载失败(下载到本地),other 为预留位。

  • MID_GETSTATUSdSignal模块状态 ,执行失败时返回固定值 0x09other 为预留位。

  • MID_VERIFY/MID_GETUSERINFOdSignal是否为管理员(1 为管理员,0 为非管理员) 。如果执行失败返回固定 0x09other 为获取的 用户 ID

  • MID_ENROLL_SINGLE/MID_ENROLL_ITGother 为获取的 用户 IDdSignal 仅表示 为指令 返回的状态

  • MID_GET_ALL_USERID/MID_TRANS_FILE_PACKETother 为获取的 用户个数 ,当返回结果为失败时,返回的用户个数固定为 0xFFFFdSignal 仅表示 为指令 返回的状态

注意

如果需要猫眼画面实时显示,需要用到 ApusIDE 提供的视频控件,需要进行手写配置部分参数,可以参考如下代码:

c++ 复制代码
void Frm05::wMTimer1_timer_cb(uint16_t code, LvEvent e) {
  if(eShowed)
    return;
  else{
  #ifdef __arm__
    if(stt::util::FileUtil::fileExists("/dev/video0")){
      wMVideo1 = new STTFFmpeg(p_rt, this, "wMVideo1");
      wMVideo1->enHardDecode = false;
			wMVideo1->setRotate(0);
			wMVideo1->setMainArg(176, 130, 480, 640, "/dev/video0");
			wMVideo1->setRotateContent(270);
			wMVideo1->play();
      this->refresh();
      eShowed = true;
    }
  #endif
  }
}

代码讲解

该代码为一段定时器代码,展示了开启摄像头 USB 猫眼画面的过程。

c++ 复制代码
stt::util::FileUtil::fileExists("/dev/video0");

“/dev/video0” 该路径为摄像头画面路径

c++ 复制代码
wMVideo1 = new STTFFmpeg(p_rt, this, "wMVideo1");
wMVideo1->enHardDecode = false;
wMVideo1->setRotate(0);
wMVideo1->setMainArg(176, 130, 480, 640, "/dev/video0");
wMVideo1->setRotateContent(270);
wMVideo1->play();
this->refresh();
  • wMVideo1 为默认配置(需要在.h文件中自行添加函数定义STTFFmpeg *wMVideo1),该摄像头模组支持的原生分辨率为640*480,也可以支持480*320,如果任意设置长宽会导致画面进行不同程度的拉伸。
  • 如果希望修改画面位置,可以如下图添加,设置并记录播放器的位置。最后删除控件。
  • 最后记得在 下载到程序 时要下载 视频播放器 控件中的有关于视频播放的库文件,如下图所示

该例程将会在技术支持时被提供。

上一个
通用MQTT(3.1 3.1.1)驱动
下一个
指纹识别驱动
最近修改: 2025-01-02Powered by