人脸识别模块使用的是易胜公司提供的人脸识别模块。识别速度快,识别效率高。利用该模块,用户可以实现基本的用户注册、用户登录、照片上传以及数据下传的功能。以下为具体功能及使用方法的介绍。
目前人脸识别模块只适用于自定义分辨率型号,大小为800*1280
。选择完成后,选择 下一步 直至工程创建完成即可。
右键 设备管理 进行添加,下拉框中选择 其他,进而选择 人脸识别模块
点击 下一步 直至模块选择完毕
人脸识别模块在模拟器中是不生效的,因此我们只需要对 HMI 进行配置即可,按照如下内容对串口进行设置即可
至此,配置已全部设置完毕。下面将进行 API 讲解及使用方式。
所有的使用方法如下所示
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
};
};
获得的返回状态如下
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
};
};
重置模块。将正在进行的流程进行中断,返回原始状态。传入的类型为bool
,调用方法如下:
vm->setInt("模块重置",1,true);
获取当前的模块状态。传入的类型为bool
,调用方法如下:
vm->setInt("模块获取",1,true);
返回类型如下:
模组的状态包括:
0: MS_STANDBY(模组处于空闲状态,等待主控命令)
1: MS_BUSY(模组处于工作状态)
2: MS_ERROR(模组出错,不能正常工作)
3: MS_INVALID(模组未进行初始化)
4: MS_OTA(OTA 升级中)
对传入用户进行验证。返回用户唯一ID
以及是否为管理员
(1-管理员 0-非管理员)。传入的类型为bool
,调用方法如下:
vm->setInt("验证",1,true);
对用户进行注册(可重复注册)。传入的类型为string字符串
,调用方法如下:
// 这样设置表示 当前注册的用户为zhangsan 给他设置为1-管理员 0-非管理员
vm->setChar("可重复注册","zhangsan1",true);
// 也可以这样设置 不加姓名 设置为1-管理员 0-非管理员
vm->setChar("可重复注册","1",true);
删除单个用户。 需要先获取用户 ID ,再进行删除。传入的类型为int
,调用方法如下:
int userid = 1;//先获取当前用户id
vm->setInt("删除用户",userid,true);
删除全部已注册用户。传入的类型为bool
,调用方法如下:
vm->setInt("删除全部用户",1,true);
获取用户信息。 需要先获取用户 ID ,再进行获取。传入的类型为int
,调用方法如下:
int userid = 1;//先获取当前用户id
vm->setInt("获取用户信息",userid,true);
清除正在录入的状态。传入的类型为bool
,调用方法如下:
vm->setInt("清除状态",1,true);
关机指令。 特别注意:在执行完所有操作之后 需要使用该命令进行关机,直接断电模块将会损坏使用寿命,降低使用年限 。传入的类型为bool
,调用方法如下:
vm->setInt("关机",1,true);
截图指令,在识别过程中进行截图,图片为IR红外图片
,注意:调用该命令后需要调用MID_GETSAVEDIMAGE
才能完成截图。传入的类型为bool
,调用方法如下:
vm->setInt("截图",1,true);
保存图片。该指令可以和MID_SNAPIMAGE
配合使用,也可以单独使用。配合使用的时候图片为IR黑白图片
,单独使用时在光线充足时为RGB彩色图片
,在光线不足时为IR黑白图片
。在该指令执行成功后,会自动调用MID_UPLOADIMAGE
,将图片保存在指定的路径下,为jpg
格式图片。图片保存的过程中,需要进行等待(约 5s 内),等待期间不可进行其他操作。传入的类型为string字符串
,为保存图片的路径。路径文件夹必须存在,调用方法如下:
string path = "/customer/prm/images/a.jpg";
vm->setChar("保存图片",path,true);
下传图片数据并注册用户(普通用户)。需要将jpg
图片,通过易胜提供的工具转化为.bin
的数据文件(可在技术支持群中向我们获取),传入.bin
的数据文件,上传成功即注册成功,后续可以对其进行验证等其他操作。传入的类型为string字符串
,为保存图片数据的路径。调用方法如下:
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
,就是各种指令返回的组合值,下面是具体介绍:
根据人脸识别文档指示
在上位机处于休眠模式前,请将串口两个引脚模式配置成输出低电平模式。
因此,我们需要在使用模块的时候 手动开启/关闭 gpio ,在使用页面onLoad
函数中打开 gpio,在页面析构中关闭 gpio。
//开启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);
}
在上电时,模块会发送上电指令。我们只需要直接获取指令结果,从而获取模块是否上电成功的状态。
int r;
vm->getInt("注册标志", r,true);
上电成功后,即可进行接下来的操作。
REPLY_STATUS 分为三个组成部分。我们将通过以下代码对此进行讲解
/**
* 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_RESET、MID_DELUSER、MID_DELALL、MID_FACERESET、MID_POWERDOWN、MID_SNAPIMAGE、MID_UPLOADIMAGE。dSignal 仅表示 为指令 返回的状态 ,other 仅为预留位,不做任何值。
MID_UPLOADIMAGE 的 dSignal 为 0x00 时表示 图片下载成功,0x01 为图片下载失败(下载到本地),other 为预留位。
MID_GETSTATUS 的 dSignal 为 模块状态 ,执行失败时返回固定值 0x09,other 为预留位。
MID_VERIFY/MID_GETUSERINFO 的 dSignal 为 是否为管理员(1 为管理员,0 为非管理员) 。如果执行失败返回固定 0x09。other 为获取的 用户 ID。
MID_ENROLL_SINGLE/MID_ENROLL_ITG 的 other 为获取的 用户 ID,dSignal 仅表示 为指令 返回的状态。
MID_GET_ALL_USERID/MID_TRANS_FILE_PACKET 的 other 为获取的 用户个数 ,当返回结果为失败时,返回的用户个数固定为 0xFFFF,dSignal 仅表示 为指令 返回的状态。
如果需要猫眼画面实时显示,需要用到 ApusIDE 提供的视频控件,需要进行手写配置部分参数,可以参考如下代码:
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 猫眼画面的过程。
stt::util::FileUtil::fileExists("/dev/video0");
“/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();
.h
文件中自行添加函数定义STTFFmpeg *wMVideo1
),该摄像头模组支持的原生分辨率为640*480
,也可以支持480*320
,如果任意设置长宽会导致画面进行不同程度的拉伸。该例程将会在技术支持时被提供。