ArcFaceTM
虹软人脸认知引擎 (检测、跟踪、识别)
免费下载开发
拥抱人工智能,虹软让“刷脸”无处不在!
永久免费 安全独立 最高识别率
将ArcFace 装进您的应用,不仅仅有人脸识别,还拥有人脸跟踪
立即免费下载开发

人工智能热潮下,AI技术在各行各业的应用面临前所未有的机遇。从行业用户、商业用户、到个人用户,在门禁、考勤、通道、卡口、智能家居、机器人、医疗、制造、金融、安防监控……以及更多领域有着迫切的应用需求,拥有巨大的市场前景。

然而,从基础技术到真正的产品,中间需要历经较长的周期,从算法实现到产品化的成本非常高,构筑了中小企业进入AI领域的技术门槛。虹软作为一家技术创新型公司,拥有全球最领先,最前沿的视觉人工智能技术。一直坚信,任何先进的算法和技术,只有被大量应用于各个领域,真正成为解决实际问题的产品和方案,才能发挥出价值,真正为行业附能,为社会造福。

为了帮助巨量的中小企业打破技术壁垒,快速运用人脸技术,尽快转化为真正有价值的产品,虹软将20年来经行业检验积累并已广泛应用于各种设备上的人脸认知引擎,开放供免费使用。

可自组网、自建云,不用担心数据安全,只要发挥您的创造力,虹软助您的产品即刻拥抱人工智能,尽快抢占商机!

更多场景,更多能力

  • 智慧应用
    刷脸无处不在,创意点亮智慧生活
  • 身份识别
    识别本人与证件是否为同一人
  • 智能家居
    人脸识别实现个性化设置
  • 机器人
    智能辅助,带来最贴心的服务
  • 人脸门禁
    智能门禁,刷脸开门
  • 社区监控
    识别居民身份,保障社区安全
根据不同的应用场景,提供最适配的引擎包
离线下载,快速集成

人脸比对(1:1) 免费

人脸比对(1:1)主要用来分析两张脸的相似度,多用于用户认证及身份验证。您会得到一个相似度的分数以及相应的阈值。

用户验证:

将实拍照片与底图对比

  1. 刷脸登录
  2. 远程开户
  3. 在线培训
•••

身份验证:

将人脸照片与证件照片进行对比

  1. 机场/火车站/地铁/出入境
  2. 医保/社保
  3. 考场
  4. 银行
•••

人脸检索(1:N)

针对一张输入的人脸,在已建立的人脸数据库中检索相似的人脸。

小型网络:免费

人脸集合100范围内达到最优

适用于识别家庭成员的智能家居、机器人、人脸考勤等应用。

中型网络:免费

人脸集合1000范围内达到最优

适用于身份识别、人脸门禁、人脸关卡等应用, 如医院、学校、社区、商铺、商场等各种场景。

大型网络:联系我们

适用应用场景更为复杂,需要更多的数据处理,诸如公共安全、大型组织或机构。

若有此类需求,请联系虹软商务

ArcFaceTM 虹软人脸认知引擎功能
集合人脸检测、人脸跟踪、人脸识别三大功能

我们专注于人脸技术,在大角度或不同角度下,低光背光环境下,人脸移动或不同表情、年龄,遮挡,设备移动等情况下,以高成功率、低误检率,持续在全球保持业界领先水平。虹软在人脸相关领域里的研究成果及技术应用不论是其深度和广度,都是全球领先者。

目前虹软ArcFace(人脸认知引擎)开放人脸检测、人脸跟踪、人脸识别三大功能,供开发者下载使用。

人脸检测 (Face Detection)

人脸检测是人脸技术的基础,使用虹软人脸引擎,能够帮助您检测并且定位到影像(图片或者视频)中的人脸。

特点 :虹软的人脸检测技术支持强光、弱光、黑夜、背光等多种复杂环境。并且可检测出正脸,侧脸等多种角度人脸的位置。

人脸跟踪 (Face Tracking)

精确定位并追踪面部区域位置,随着人物脸部位置的变化能够快速定位人脸位置,并且适用于不同表情、性别、年龄、姿态、光照等条件。

特点 :虹软人脸跟踪技术耗能低,追踪丢失率极低。引擎支持多人脸实时跟踪,具有精度高,适配角度广,速度快,引擎小等特点。

人脸识别 (Face Recognition)

引擎可独立运行在终端设备或者独立服务器中,应用端可独立完成算法运行,能保证用户数据的私密性,自主运营与保护用户敏感信息。

特点 :具有高识别率,高性能,低功耗等特性。

功能优势

更准确
业内领先的高识别、 低误识
经过行业检验
易集成
便于进行二次开发,更易于开发者系统性的集成应用
适应性强
高性能低功耗,支持如暗光环境、侧脸、遮挡等复杂情况

不断推陈出新

我们始终保持更新优化引擎,脚步不曾停歇
七月
20
2017

2017-07-20ArcFaceTM

人脸认知引擎

根据不同应用场景设计,针对性强。包括人脸检测、人脸跟踪、人脸识别,即使在离线环境下也可正常运行。

运行环境与指标

运行环境

Windows

Android

iOS
最低硬件配置
(可运行算法)
Intel® CoreTM i5-2300@2.80GHz 或者同级别芯片
高通MSM 8937
或者同级别芯片
Apple A7
推荐硬件配置
(具有良好的体验)
Intel® CoreTM i7-4600U@2.1GHz 或者同级别芯片
高通MSM8953
或者同级别芯片
Apple A9
系统版本要求
Windows 7 及以上
Android 5.0 及以上
iOS 8.0 及以上
引擎使用其他说明
为了能够保持持续竞争力,引擎需要在一年内升级,请您务必及时更新。
-
-
运行
环境

Windows

Android

iOS
最低
配置

Intel® CoreTM

i5-2300

@2.80GHz或者

同级别芯片

高通MSM
8937或者
同级别芯片
Apple A5
推荐
配置

Intel®CoreTM

i7-4600U

@2.1GHz或者

同级别芯片

高通MSM
8953或者
同级别芯片
Apple A7
系统
要求
Windows 7
及以上
Android
5.0
及以上
iOS 8.0
及以上
其他
说明
为了能够保持持续竞争力,引擎需要在一年内升级,请您务必及时更新。
-
-
API接入说明
如何将ArcFace装进应用
前提条件
从虹软官网下载获取ArcFace引擎应用开发包,及其对应的激活码(App_id, SDK_key)
将获取到的开发包导入到您的应用中

App_id与SDK_key是在初始化的时候需要使用
基本类型
所有基本类型在平台库中有定义。 定义规则是在ANSIC 中的基本类型前加上字母“M”同时将类型的第一个字母改成大写。例如“long” 被定义成“MLong”
数据结构与枚举
AFR_FSDK _FACEINPUT
描述: 脸部信息
定义
typedef struct{
MRECT		rcFace;
MInt32		lOrient;
} AFR_FSDK_FACEINPUT, *LPAFR_FSDK_FACEINPUT;
                                
成员描述
rcFace
脸部矩形框信息
lOrient
脸部旋转角度
AFR_FSDK_FACEMODEL
描述: 脸部特征信息
定义
typedef struct{
MByte		*pbFeature;
MInt32		lFeatureSize;
} AFR_FSDK_FACEMODEL, *LPAFR_FSDK_FACEMODEL;
                                
成员描述
pbFeature
提取到的脸部特征
lFeatureSize
特征信息长度
AFR_FSDK_VERSION
描述: 引擎版本信息
定义
typedef struct{
MInt32			lCodebase;
MInt32			lMajor;
MInt32			lMinor;
MInt32			lBuild;
MInt32 		lFeatureLevel;
MPChar			Version;
MPChar			BuildDate;
MPChar  		CopyRight;
} AFR_FSDK_VERSION, *LPAFR_FSDK_VERSION;
                                
成员描述
lCodebase
代码库版本号
lMajor
主版本号
lMinor
次版本号
lBuild
编译版本号,递增
lFeatureLevel
特征库版本号
Version
字符串形式的版本号
BuildDate
编译时间
CopyRight
版权
枚举
AFR_FSDK_ORIENTCODE
描述: 基于逆时针的脸部方向枚举值
定义
enum AFR_FSDK_ORIENTCODE{
	AFR_FSDK_FOC_0		= 0x1,
	AFR_FSDK_FOC_90		= 0x2,
	AFR_FSDK_FOC_270		= 0x3,
	AFR_FSDK_FOC_180         	= 0x4,
	AFR_FSDK_FOC_30		= 0x5,
	AFR_FSDK_FOC_60		= 0x6,
	AFR_FSDK_FOC_120		= 0x7,
	AFR_FSDK_FOC_150		= 0x8,
	AFR_FSDK_FOC_210		= 0x9,
	AFR_FSDK_FOC_240		= 0xa,
	AFR_FSDK_FOC_300		= 0xb,
	AFR_FSDK_FOC_330		= 0xc
};
                  
成员描述
AFR_FSDK_FOC_0
0 度
AFR_FSDK_FOC_90
90度
AFR_FSDK_FOC_270
270度
AFR_FSDK_FOC_180
180度
AFR_FSDK_FOC_30
30度
AFR_FSDK_FOC_60
60度
AFR_FSDK_FOC_120
120度
AFR_FSDK_FOC_150
150度
AFR_FSDK_FOC_210
210度
AFR_FSDK_FOC_240
240度
AFR_FSDK_FOC_300
300度
AFR_FSDK_FOC_330
330度
支持的颜色格式
描述: 颜色格式及其对齐规则
定义
ASVL_PAF_I420 	 8-bit Y层,之后是8-bit的2x2 采样的U层和V层
ASVL_PAF_YUYV 	 Y0, U0, Y1, V0
ASVL_PAF_RGB24_B8G8R8 	BGR24, B8G8R8
                                
API Reference
AFR_FSDK_InitialEngine
描述: 初始化引擎参数
原型
MRESULT AFR_FSDK_InitialEngine(
MPChar		AppId,
MPChar		SDKKey,
Mbyte		*pMem,
MInt32		lMemSize,
MHandle	        *phEngine
);
                 
参数
AppId
[in] 用户申请SDK时获取的App Id
SDKKey
[in] 用户申请SDK时获取的SDK Key
pMem
[in] 分配给引擎使用的内存地址
lMemSize
[in] 分配给引擎使用的内存大小
phEngine
[out] 引擎handle
返回值: 成功返回MOK,否则返回失败code。失败codes如下所列:
MERR_INVALID_PARAM 参数输入非法
MERR_NO_MEMORY 内存不足
AFR_FSDK_ExtractFRFeature
描述: 获取脸部特征参数
原型
MRESULT AFR_FSDK_ExtractFRFeature (
    MHandle			hEngine,
    LPASVLOFFSCREEN		pInputImage,
    LPAFR_FSDK_FACEINPUT	pFaceRes,
    LPAFR_FSDK_FACEMODEL	pFaceModels
);
                            
参数
hEngine
[in] 引擎handle
pInputImage
[in] 输入的图像数据
pFaceRes
[in] 已检测到的脸部信息
pFaceModels
[out] 提取的脸部特征信息
返回值: 成功返回MOK,否则返回失败code。失败codes如下所列:
MERR_INVALID_PARAM 参数输入非法
MERR_NO_MEMORY 内存不足
AFR_FSDK_FacePairMatching
描述: 脸部特征比较
原型
MRESULT AFR_FSDK_FacePairMatching(
	MHandle			hEngine,
	AFR_FSDK_FACEMODEL		*reffeature,
	AFR_FSDK_FACEMODEL		*probefeature,
	MFloat     			*pfSimilScore
);
                            
参数
hEngine
[in] 引擎handle
reffeature
[in] 已有脸部特征信息
probefeature
[in] 被比较的脸部特征信息
pfSimilScore
[out] 脸部特征相似程度数值
返回值: 成功返回MOK,否则返回失败code。失败codes如下所列:
MERR_INVALID_PARAM 参数输入非法
MERR_NO_MEMORY 内存不足
AFR_FSDK_UninitialEngine
描述: 销毁引擎,释放相应资源
原型
MRESULT AFR_FSDK_UninitialEngine(
	MHandle          hEngine
);
                            
参数
hEngine
[in] 引擎handle
返回值: 成功返回MOK,否则返回失败code。失败codes如下所列:
MERR_INVALID_PARAM 参数输入非法
AFR_FSDK_GetVersion
描述: 获取SDK版本信息参数
原型
const AFR_FSDK_VERSION *  AFR_FSDK_GetVersion(
     MHandle          hEngine
     );

                            
参数
hEngine
[in] 引擎handle
其他说明
其他说明: 此版本为免费开放的标准版本(为保证最优体验,建议注册人脸数小于1000),若有定制升级需求,请联系我们。
C语言示例代码
注意,使用时请替换申请的 APPID 和 SDKKEY,并设置好文件路径和图像尺寸

    #include "stdafx.h"
    #include <stdlib.h>
    #include <stdint.h>
    #include <Windows.h>
    #include "arcsoft_fsdk_face_recognition.h"
    #include "merror.h"

    #pragma comment(lib,"libarcsoft_fsdk_face_recognition.lib")

    #define WORKBUF_SIZE        (40*1024*1024)
    #define INPUT_IMAGE1_PATH "sample1.bmp"
    #define INPUT_IMAGE2_PATH "sample2.bmp"

    bool readBmp(const char* path, uint8_t **imageData, int *pWidth, int *pHeight)
    {
        if (path == NULL || imageData == NULL || pWidth == NULL || pHeight == NULL)
        {
            fprintf(stderr, "ReadBmp para error\r\n");
            return false;
        }
        FILE *fp = fopen(path, "rb");
        if (fp == 0)
        {
            fprintf(stderr, "Bmp file open failed\r\n");
            return false;
        }
     fseek(fp, sizeof(BITMAPFILEHEADER), 0);  BITMAPINFOHEADER head;
        fread(&head, sizeof(BITMAPINFOHEADER), 1, fp);
        *pWidth = head.biWidth;  	*pHeight = head.biHeight;  	int biBitCount = head.biBitCount;  	int lineByte = ((*pWidth) * biBitCount / 8 + 3) / 4 * 4;  	*imageData = (uint8_t *)malloc(lineByte * (*pHeight));  	for (int i = 0; i < *pHeight; i++)
        {
            fseek(fp, (*pHeight - 1 - i) * lineByte + 54, SEEK_SET);   	 	fread(*imageData + i * (*pWidth) * 3, 1, (*pWidth) * 3, fp);
        }
        fclose(fp);  	return true;
    } int _tmain(int argc, _TCHAR* argv[])
    {
        //初始化
        MRESULT nRet = MERR_UNKNOWN;  	MHandle hEngine = nullptr;  	char APPID[256] = "APPID";  	char SDKKey[256] = "SDKKey";  	MInt32 nScale = 16;
        MInt32 nMaxFace = 10;
        MByte *pWorkMem = (MByte *)malloc(WORKBUF_SIZE);
        if (pWorkMem == nullptr)
        {
            fprintf(stderr, "fail to malloc workbuf\r\n");
            return -1;
        }
        nRet = AFR_FSDK_InitialEngine(APPID, SDKKey, pWorkMem, WORKBUF_SIZE,
    &hEngine);
        if (nRet != MOK || hEngine == nullptr)
        {
            fprintf(stderr, "InitialFaceEngine failed , errorcode is %d \r\n", nRet);
            return -1;
        }
        //获取版本信息
        const AFR_FSDK_Version * pVersionInfo = nullptr;  	pVersionInfo = AFR_FSDK_GetVersion(hEngine);  	fprintf(stdout, "%d %d %d %d %d\r\n", pVersionInfo->lCodebase, pVersionInfo->lMajor, pVersionInfo->lMinor, pVersionInfo->lBuild, pVersionInfo-
    >lFeatureLevel);  	fprintf(stdout, "%s\r\n", pVersionInfo->Version);  	fprintf(stdout, "%s\r\n", pVersionInfo->BuildDate);  	fprintf(stdout, "%s\r\n", pVersionInfo->CopyRight);
        //读取第一张bmp图片数据
        ASVLOFFSCREEN offInput1 = { 0 };
        offInput1.u32PixelArrayFormat = ASVL_PAF_RGB24_B8G8R8;  	offInput1.ppu8Plane[0] = nullptr;
        readBmp(INPUT_IMAGE1_PATH, (uint8_t**)&offInput1.ppu8Plane[0],
    &offInput1.i32Width, &offInput1.i32Height);
        if (!offInput1.ppu8Plane[0])
        {
            fprintf(stderr, "fail to ReadBmp(%s)\r\n", INPUT_IMAGE1_PATH);
            AFR_FSDK_UninitialEngine(hEngine);
            free(pWorkMem);  	 	return -1;
        }
        offInput1.pi32Pitch[0] = offInput1.i32Width * 3;
        AFR_FSDK_FACEMODEL faceModels1 = { 0 };
        {
            AFR_FSDK_FACEINPUT faceResult;
            //第一张人脸信息通过face detection\face tracking获得  	 	faceResult.lOrient = AFR_FSDK_FOC_0;//人脸方向  	 	faceResult.rcFace.left = 346;//人脸框位置  	 	faceResult.rcFace.top = 58;  	 	faceResult.rcFace.right = 440;
            faceResult.rcFace.bottom = 151;
            //提取第一张人脸特征
            AFR_FSDK_FACEMODEL LocalFaceModels = { 0 };
            nRet = AFR_FSDK_ExtractFRFeature(hEngine, &offInput1, &faceResult,
    &LocalFaceModels);
            if (nRet != MOK)
            {
                fprintf(stderr, "fail to Extract 1st FR Feature, error
    code: %d\r\n", nRet);
            }
            faceModels1.lFeatureSize = LocalFaceModels.lFeatureSize;  	 	faceModels1.pbFeature = (MByte*)malloc(faceModels1.lFeatureSize);  	 	memcpy(faceModels1.pbFeature, LocalFaceModels.pbFeature, faceModels1.lFeatureSize);
        }

        //读取第二张bmp图片数据
        ASVLOFFSCREEN offInput2 = { 0 };
        offInput2.u32PixelArrayFormat = ASVL_PAF_RGB24_B8G8R8;  	offInput2.ppu8Plane[0] = nullptr;
        readBmp(INPUT_IMAGE2_PATH, (uint8_t**)&offInput2.ppu8Plane[0],
    &offInput2.i32Width, &offInput2.i32Height);
        if (!offInput2.ppu8Plane[0])
        {
            fprintf(stderr, "fail to ReadBmp(%s)\r\n", INPUT_IMAGE2_PATH);
            free(offInput1.ppu8Plane[0]);  	 	AFR_FSDK_UninitialEngine(hEngine);
            free(pWorkMem);  	 	return -1;
        }
        offInput2.pi32Pitch[0] = offInput2.i32Width * 3;
        AFR_FSDK_FACEMODEL faceModels2 = { 0 };
        {
            AFR_FSDK_FACEINPUT faceResult;
            //第二张人脸信息通过face detection\face tracking获得  	 	faceResult.lOrient = AFR_FSDK_FOC_0;//人脸方向  	 	faceResult.rcFace.left = 122;//人脸框位置  	 	faceResult.rcFace.top = 76;  	 	faceResult.rcFace.right = 478;
            faceResult.rcFace.bottom = 432;
            //提取第二张人脸特征
            AFR_FSDK_FACEMODEL LocalFaceModels = { 0 };
            nRet = AFR_FSDK_ExtractFRFeature(hEngine, &offInput2, &faceResult,
    &LocalFaceModels);
            if (nRet != MOK)
            {
       fprintf(stderr, "fail to Extract 2nd FR Feature, error code: %d\r\n", nRet);
            }
            faceModels2.lFeatureSize = LocalFaceModels.lFeatureSize;  	 	faceModels2.pbFeature = (MByte*)malloc(faceModels2.lFeatureSize);  	 	memcpy(faceModels2.pbFeature, LocalFaceModels.pbFeature, faceModels2.lFeatureSize);
        }
        //对比两张人脸特征,获得比对结果
        MFloat  fSimilScore = 0.0f;  	nRet = AFR_FSDK_FacePairMatching(hEngine, &faceModels1, &faceModels2,
    &fSimilScore);
        if (nRet == MOK)
        {
            fprintf(stdout, "fSimilScore =  %f\r\n", fSimilScore);
        }
        else  	{  	 	fprintf(stderr, "FacePairMatching failed , errorcode is %d \r\n", nRet);
        }


        //反初始化
        free(offInput1.ppu8Plane[0]);  	free(offInput2.ppu8Plane[0]);  	nRet = AFR_FSDK_UninitialEngine(hEngine);
        if (nRet != MOK)
        {
            fprintf(stderr, "UninitialFaceEngine failed , errorcode is %d \r\n", nRet);
        }
        free(pWorkMem);  	free(faceModels1.pbFeature);  	free(faceModels2.pbFeature);  	return 0;
    }  

                                
类描述
Class AFR_FSDKFace
功能描述: 这个类用来保存人脸特征信息
构造函数:
AFR_FSDKFace(AFR_FSDKFace self)
                                
参数:
self
[in]
类对象,创建的对象和传入的对象数据一致
AFR_FSDKFace()

                                    
AFR_FSDKFace(byte[] data)
                                    
参数:
data
[in]
人脸特征信息,一般由引擎检测得到,也可以保存在本地加载
成员函数:
byte[] getFeatureData()
返回值:特定长度的人脸特征信息
void setFeatureData(byte[] data)
                               
参数:
data
[in]
特征数据长度
AFR_FSDKFace clone()
返回值:本对象的拷贝
                               
类常量:
FEATURE_SIZE
22020
引擎定义的特征信息数据长度
Class AFR_FSDKError
功能描述: 这个类用来保存错误信息
构造函数:
AFD_FSDKError()
                               
成员函数:
int getCode()
返回值:错误码值(MOK, MERR_INVALID_PARAM等)
                               
类常量:
引擎返回的错误值定义
参数
MOK
0
成功
MERR_BASIC_BASE
0x0001
基础错误起始值
MERR_UNKNOWN
0x0001
未知错误
MERR_INVALID_PARAM
0x0002
参数错误
MERR_UNSUPPORTED
0x0003
输入了引擎不支持的参数或者数据
MERR_NO_MEMORY
0x0004
内存不足
MERR_BAD_STATE
0x0005
状态错误(未初始化就调用了接口)
MERR_BUFFER_OVERFLOW
0x0009
内存上溢
MERR_BUFFER_UNDERFLOW
0x000a
内存下溢
MERR_FSDK_BASE
0x7000
校验错误起始值
MERR_FSDK_INVALID_APP_ID
0x7001
非法APPID
MERR_FSDK_INVALID_SDK_ID
0x7002
非法SDKID
MERR_FSDK_INVALID_ID_PAIR
0x7003
SDKKEY不是于当前APPID名下的
MERR_FSDK_MISMATCH_ID_AND_SDK
0x7004
SDKKEY不是当前SDK所支持的
MERR_FSDK_SYSTEM_VERSION_UNSUPPORTED
0x7005
不支持的系统版本
MERR_FSDK_LICENCE_EXPIRED
0x7006
SDK过期
MERR_FSDK_FR_ERROR_BASE
0x12000
FR错误起始值
MERR_FSDK_FR_INVALID_MEMORY_INFO
0x12001
内存信息错误
MERR_FSDK_FR_INVALID_IMAGE_INFO
0x12002
图像信息错误
MERR_FSDK_FR_INVALID_FACE_INFO
0x12003
人脸信息错误
MERR_FSDK_FR_NO_GPU_AVAILABLE
0x12004
GPU不支持
MERR_FSDK_FR_MISMATCHED_FEATURE_LEVEL
0x12005
特征信息版本不匹配
Class AFR_FSDKVersion
功能描述: 这个类用来保存版本信息
构造函数:
AFD_FSDKVersion()
                                   
成员函数:
String toString()
返回值:包含所有版本信息的字符串
                            
Class AFR_FSDKMatching
功能描述: 这个类用来保存特征信息匹配度
构造函数:
AFR_FSDKMatching()
                                   
成员函数:
float getScore()
返回值:两份人脸特征信息的特征匹配分数 ,分数范围:[0,1.0]
                                   
Class AFR_FSDKEngine
功能描述: 这个类具体实现了人脸识别的功能
构造函数:
AFR_FSDKEngine()
                                   
成员函数:
AFR_FSDKError AFR_FSDK_InitialEngine(String appid, String sdkkey)
描述:这个函数功能为初始化引擎。创建对象后,必须先于其他成员函数调用,否则其他成员函数会返回MERR_BAD_STATE
返回值:返回AFR_FSDKError对象,具体错误信息参考 Class AFR_FSDKError
                                   
参数
String appid
用户申请SDK时获取的App Id
String sdkkey
用户申请SDK时获取的SDK Key
AFR_FSDKError AFR_FSDK_ExtractFRFeature(
byte[]data,int width,int height, int format,Rect face,nt ori,AFR_FSDKFace feature)
说明:函数功能为检测输入图像中的人脸特征信息,输出结果保存在AFR_FSDKFace feature
返回值:回AFR_FSDKError对象,具体错误信息参考 Class AFR_FSDKError
                                       
参数
byte[] data
输入的图像数据
nt width
图像宽度
int height
图像高度
int format
图像格式
Rect face
已检测到的脸框
int ori
已检测到的脸角度
AFR_FSDKFace feature
AFR_FSDKFace feature 检测到的人脸特征信息
AFR_FSDKError AFR_FSDK_FacePairMatching(AFR_FSDKFace ref, AFR_FSDKFace input, AFR_FSDKMatching score)
说明: 函数功能为比较两份人脸特征信息的匹配度
返回值:返回AFR_FSDKError对象,具体错误信息参考 Class AFR_FSDKError
                                           

参数
ref
[in]
脸部特征信息对象
input
[in]
脸部特征信息对象
score
[in]
匹配度对象
AFR_FSDKError AFR_FSDK_GetVersion(AFR_FSDKVersion version)
说明: 函数功能为获取引擎版本信息
返回值:返回AFR_FSDKError对象,具体错误信息参考 Class AFR_FSDKError
                                           
参数
version
[in]
保存版本信息对象
AFR_FSDKError AFR_FSDK_UninitialEngine()
说明: 销毁引擎,释放内存资源
返回值:返回AFR_FSDKError对象,具体错误信息参考 Class AFR_FSDKError
                                           
类常量:
引擎支持的颜色格式
参数
CP_PAF_NV21
0x802 8-bit Y层,之后是8-bit的2x2 采样的U,V交织层
人脸角度:检测结果中的人脸角度
参数
AFR_FOC_0
0x1
0 度
AFR_FOC_90
0x2
90度
AFR_FOC_270
0x3
270 度
AFR_FOC_180
0x4
180 度
AFR_FOC_30
0x5
30 度
AFR_FOC_60
0x6
60 度
AFR_FOC_120
0x7
120 度
AFR_FOC_150
0x8
150 度
AFR_FOC_210
0x9
210度
AFR_FOC_240
0xa
240 度
AFR_FOC_300
0xb
300 度
AFR_FOC_330
0xc
330 度
其他说明
说明: “此版本为免费开放的标准版本(为保证最优体验,建议注册人脸数小于1000),若有定制升级需求,请联系我们。”
JAVA代码

    AFR_FSDKInterface engine = new AFR_FSDKEngine();

    //用来存放提取到的人脸信息, face_1 是注册的人脸,face_2 是要识别的人脸
    AFR_FSDKFace face1 = new AFR_FSDKFace();
    AFR_FSDKFace face2 = new AFR_FSDKFace();

    //初始化人脸识别引擎,使用时请替换申请的 APPID 和 SDKKEY
    AFR_FSDKError error = engine.AFR_FSDK_InitialEngine("APPID", "SDKKEY");
    Log.d("com.arcsoft", "AFR_FSDK_InitialEngine = " + error.getCode());

    //输入的 data 数据为 NV21 格式(如 Camera 里 NV21 格式的 preview 数据);人脸坐标一般使用人脸检测返回的 Rect 传入;人脸角度请按照人脸检测引擎返回的值传入。
    error = engine.AFR_FSDK_ExtractFRFeature(data1, width, height, AFR_FSDKEngine.CP_PAF_NV21, new Rect(210, 178, 478, 446), AFR_FSDKEngine.AFR_FOC_0, face1);
    Log.d("com.arcsoft", "Face=" + face1.getFeatureData()[0]+ "," + face1.getFeatureData()[1] + "," + face1.getFeatureData()[2] + "," + error.getCode());

    error = engine.AFR_FSDK_ExtractFRFeature(data1, width, height, AFR_FSDKEngine.CP_PAF_NV21, new Rect(210, 170, 470, 440), AFR_FSDKEngine.AFR_FOC_0, face2);
    Log.d("com.arcsoft", "Face=" + face2.getFeatureData()[0]+ "," + face2.getFeatureData()[1] + "," + face2.getFeatureData()[2] + "," + error.getCode());

    //score 用于存放人脸对比的相似度值
    AFR_FSDKMatching score = new AFR_FSDKMatching(); error = engine.AFR_FSDK_FacePairMatching(face1, face2, score); Log.d("com.arcsoft", "AFR_FSDK_FacePairMatching=" + error.getCode()); Log.d("com.arcsoft", "Score:" + score.getScore());

    //销毁人脸识别引擎
    error = engine.AFR_FSDK_UninitialEngine();
    Log.d("com.arcsoft", "AFR_FSDK_UninitialEngine : " + error.getCode());

                                
前提条件
从虹软官网下载获取ArcFace引擎应用开发包,及其对应的激活码(App_id, SDK_key)
将获取到的开发包导入到您的应用中

App_id与SDK_key是在初始化的时候需要使用
基本类型
所有基本类型在平台库中有定义。 定义规则是在ANSIC 中的基本类型前加上字母“M”同时将类型的第一个字母改成大写。例如“long” 被定义成“MLong”
数据结构与枚举
AFR_FSDK _FACEINPUT
描述: 通过人脸检测引擎获得的脸部信息
定义
typedef struct{
    MREC     TrcFace;
    MInt32   lOrient;
} AFR_FSDK_FACEINPUT, *LPAFR_FSDK_FACEINPUT;
                                
成员描述
rcFace
人脸矩形框信息
lOrient
脸部旋转角度
AFR_FSDK_FACEMODEL
描述: 脸部特征信息
定义
typedef struct{
    MByte    *pbFeature;
    MInt32   lFeatureSize;
} AFR_FSDK_FACEMODEL, *LPAFR_FSDK_FACEMODEL;
                                
成员描述
pbFeature
人脸特征信息
lFeatureSize
人脸特征信息长度
AFR_FSDK_Version
描述: SDK版本信息
定义
typedef struct{
    MInt32 lCodebase;
    MInt32 lMajor;
    MInt32 lMinor;
    MInt32 lBuild;
    MInt32 lFeatureLevel;
    MPChar Version;
    MPChar BuildDate;
    MPChar CopyRight;
} AFR_FSDK_Version;

                                
成员描述
lCodebase
代码库版本号
lMajor
主版本号
lMinor
次版本号
lBuild
编译版本号,递增
lFeatureLevel
人脸特征库版本号
Version
字符串形式的版本号
BuildDate
编译时间
CopyRight
版权
AFR_FSDK_OrientCode
描述: 基于逆时针的脸部方向枚举值
定义
enum _AFR_FSDK_OrientCode{
    AFR_FSDK_FOC_0      = 0x1,
    AFR_FSDK_FOC_90     = 0x2,
    AFR_FSDK_FOC_270    = 0x3,
    AFR_FSDK_FOC_180    = 0x4,
    AFR_FSDK_FOC_30     = 0x5,
    AFR_FSDK_FOC_60     = 0x6,
    AFR_FSDK_FOC_120    = 0x7,
    AFR_FSDK_FOC_150    = 0x8,
    AFR_FSDK_FOC_210    = 0x9,
    AFR_FSDK_FOC_240    = 0xa,
    AFR_FSDK_FOC_300    = 0xb,
    AFR_FSDK_FOC_330    = 0xc
};
                                
成员描述
AFT_FSDK_FOC_0
0 度
AFT_FSDK_FOC_90
90度
AFT_FSDK_FOC_270
270度
AFT_FSDK_FOC_180
180度
AFR_FSDK_FOC_60
60度
AFR_FSDK_FOC_120
120度
AFR_FSDK_FOC_150
150度
AFR_FSDK_FOC_210
210度
AFR_FSDK_FOC_240
240度
AFR_FSDK_FOC_300
300度
AFR_FSDK_FOC_330
330度
支持的颜色格式
描述: 颜色格式及其对齐规则
定义
ASVL_PAF_NV12	8-bit Y层,之后是8-bit的2x2 采样的U层和V层

                                
API说明
AFR_FSDK_InitialEngine
描述: 初始化人脸识别引擎
原型
MRESULT AFR_FSDK_InitialEngine(
    MPChar   AppId,
    MPChar   SDKKey,
    MByte*   pMem,
    MLong    lMemSize,
    MHandle  *phEngine
);
                            
参数
AppId
[in] 用户申请SDK时获取的App Id
SDKKey
[in] 用户申请SDK时获取的SDK Key
pMem
[in] 分配给引擎使用的内存地址
lMemSize
[in] 分配给引擎使用的内存大小
phEngine
[out] 引擎句柄
返回值: 成功返回MOK,否则返回失败code。失败codes如下所列:
MERR_INVALID_PARAM 参数输入非法
MERR_NO_MEMORY 内存不足
AFR_FSDK_ExtractFRFeature
描述: 取脸部特征
原型
MRESULT AFR_FSDK_ExtractFRFeature (
    MHandle	      hEngine,
    LPASVLOFFSCREEN   pInputImage,
    LPAFR_FACEINPUT   pFaceRes,
    LPAFR_FACEMODEL   pFaceModels
);
                            
参数
hEngine
[in] 引擎句柄
pInputImage
[in] 输入的图像数据
pFaceRes
[in] 已检测到的脸部信息
pFaceModels
[out] 提取的脸部特征信息
返回值: 成功返回MOK,否则返回失败code。失败codes如下所列:
MERR_INVALID_PARAM 参数输入非法
MERR_NO_MEMORY 内存不足
AFR_FSDK_FacePairMatching
描述: 脸部特征比较
原型
MRESULT AFR_FSDK_FacePairMatching(
    MHandle	   hEngine,
    AFR_FACEMODEL  *reffeature,
    AFR_FACEMODEL  *probefeature,
    MFloat         *pfSimilScore
);
                            
参数
hEngine
[in] 引擎句柄
reffeature
[in] 已有脸部特征信息
probefeature
[in] 被比较的脸部特征信息
pfSimilScore
[out] 脸部特征相似程度数值
返回值: 成功返回MOK,否则返回失败code。失败codes如下所列:
MERR_INVALID_PARAM 参数输入非法
MERR_NO_MEMORY 内存不足
AFR_FSDK_UninitialEngine
描述: 销毁引擎,释放相应资源
原型
MRESULT AFR_FSDK_UninitialEngine(
    MHandle   hEngine
);
                            
参数
hEngine
[in] 引擎句柄
返回值: 成功返回MOK,否则返回失败code。失败codes如下所列:
MERR_INVALID_PARAM 参数输入非法
AFR_FSDK_GetVersion
描述: 获取SDK版本信息
原型
const AFR_FSDK_Version *AFR_FSDK_GetVersion(
    MHandle   hEngine
);
                            
参数
hEngine
[in] 引擎handle
其他说明
其他说明: “此版本为免费开放的标准版本(为保证最优体验,建议注册人脸数小于1000),若有定制升级需求,请联系我们。”
C语言示例代码

    #include "arcsoft_fsdk_face_recognition.h"
    #include "ammem.h"
    #include "merror.h"

    #include <stdlib.h>
    #include <string.h>

    #include "arcsoft_fsdk_face_recognition.h"
#include "ammem.h"
#include "merror.h"

#include <stdlib.h>
#include <string.h>


#define ARC_APP_ID                            "YOUR OWN APP ID"                   #define ARC_FR_SDK_KEY                        "YOUR OWN SDK KEY" #define ARC_FR_MEM_SIZE                       1024*1024*40

#define ARC_FR_MAX_FEATURE_COUNT_PER_PERSON      5 #define ARC_FR_SCORE_THRESHOLD                   (0.56f)

typedef struct
{
    MInt32 lFeatureSize;
    MByte *pbFeature;
}AFR_FSDK_FACEDATA, *LPAFR_FSDK_FACEDATA;

typedef struct
{
    MLong lPersonID;
    MChar szPersonName[128];
    AFR_FSDK_FACEDATA* pFaceFeatureArray;
    MInt32               nFeatureCount;
}AFR_FSDK_PERSON, *LPAFR_FSDK_PERSON;

//人脸检测实现
MRESULT detectFace(LPASVLOFFSCREEN pOff, AFR_FSDK_FACEINPUT* pFaceInput)
{
    //使用人脸检测引擎检测人脸信息     return MOK;
}

MRESULT addPersonToDB(LPAFR_FSDK_PERSON person)
{
    return  MOK;
}

MRESULT loadPersonsFromDB(LPAFR_FSDK_PERSON* persons, MLong* pPersonCount)
{
    return MOK;
}

//人脸注册实现
MRESULT doRegister()
{

    MVoid* pMemBuffer = MMemAlloc(MNull, ARC_FR_MEM_SIZE);
MHandle hEngine = MNull;

//初始化人脸识别引擎
    MRESULT mr = AFR_FSDK_InitialEngine((MPChar)ARC_APP_ID,
(MPChar)ARC_FR_SDK_KEY, (MByte*)pMemBuffer, ARC_FR_MEM_SIZE, &hEngine);     if (MOK != mr) {
        //错误码检查
    }

         do {
        ASVLOFFSCREEN offScreenIn = {0};                         offScreenIn.u32PixelArrayFormat = ASVL_PAF_NV12;
        offScreenIn.i32Width = 1280;                              offScreenIn.i32Height = 720;                             offScreenIn.pi32Pitch[0] = offScreenIn.i32Width;           offScreenIn.pi32Pitch[1] = offScreenIn.i32Width;          offScreenIn.ppu8Plane[0] = MNull;                          offScreenIn.ppu8Plane[1] = MNull;

        AFR_FSDK_FACEINPUT faceInput = {0};         mr = detectFace(&offScreenIn, &faceInput);         if (MOK != mr)
        {
            continue;
        }

        AFR_FSDK_FACEMODEL faceModel = {0};

    //提取人脸特性信息
        mr = AFR_FSDK_ExtractFRFeature(hEngine, &offScreenIn, &faceInput,
&faceModel);
        if (MOK != mr)
        {
            continue;
        }

        AFR_FSDK_FACEDATA featureData = {0};         featureData.lFeatureSize = faceModel.lFeatureSize; featureData.pbFeature = (MByte*)MMemAlloc(MNull, featureData.lFeatureSize);
        MMemCpy(featureData.pbFeature, faceModel.pbFeature, featureData.lFeatureSize);

        AFR_FSDK_PERSON person = {0};
        person.lPersonID = 330;
        strncpy(person.szPersonName , "Jack", strlen("Jack")); // input name         person.nFeatureCount = 1;
        person.pFaceFeatureArray = (AFR_FSDK_FACEDATA*)MMemAlloc(MNull, sizeof(AFR_FSDK_FACEDATA) * person.nFeatureCount);         person.pFaceFeatureArray[0] = featureData;

        addPersonToDB(&person);

      } while (MFalse);

//对人脸识别引擎做销毁
    mr = AFR_FSDK_UninitialEngine(hEngine);

    if(pMemBuffer != MNull)
    {
        MMemFree(MNull,pMemBuffer);
        pMemBuffer = MNull;
    }

    return mr;
}

//人脸识别实现
MRESULT doRecognition()
{

    MVoid* pMemBuffer = MMemAlloc(MNull, ARC_FR_MEM_SIZE);
MHandle hEngine = MNull;

//初始化人脸识别引擎
    MRESULT mr = AFR_FSDK_InitialEngine((MPChar)ARC_APP_ID,
(MPChar)ARC_FR_SDK_KEY, (MByte*)pMemBuffer, ARC_FR_MEM_SIZE, &hEngine);     if (MOK != mr) {

    }

        do {
        ASVLOFFSCREEN offScreenIn = {0};                         offScreenIn.u32PixelArrayFormat = ASVL_PAF_NV12;           offScreenIn.i32Width = 1280;                           offScreenIn.i32Height = 720;                              offScreenIn.pi32Pitch[0] = offScreenIn.i32Width;  offScreenIn.pi32Pitch[1] = offScreenIn.i32Width;
        offScreenIn.ppu8Plane[0] = MNull;                        offScreenIn.ppu8Plane[1] = MNull;

        AFR_FSDK_FACEINPUT faceInput = {0};         mr = detectFace(&offScreenIn, &faceInput);
        if (MOK != mr)
        {
            continue;
        }

        AFR_FSDK_FACEMODEL faceModel = {0};

        //提取人脸特性信息
        mr = AFR_FSDK_ExtractFRFeature(hEngine, &offScreenIn, &faceInput,
&faceModel);
        if (MOK != mr)
        {
            continue;
        }

        AFR_FSDK_FACEMODEL probeFaceModel = faceModel;

        AFR_FSDK_PERSON personRecognized = {0};
        MFloat fMaxScore = 0;

        LPAFR_FSDK_PERSON persons = MNull;         MLong lPersonCount = 0;
        loadPersonsFromDB(&persons, &lPersonCount);         for (int i = 0; i < lPersonCount; ++i)
        {
            AFR_FSDK_PERSON person = persons[i];             for (int j = 0; j < person.nFeatureCount; ++j)
            {
                AFR_FSDK_FACEMODEL refFaceModel = {0};
                refFaceModel.lFeatureSize = person.pFaceFeatureArray[j].lFeatureSize;                 refFaceModel.pbFeature = person.pFaceFeatureArray[j].pbFeature;

                MFloat fScore = 0.0;

                //人脸特性信息比对,返回两个人脸特性的相似度
                MRESULT mr = AFR_FSDK_FacePairMatching(hEngine, &refFaceModel,
&probeFaceModel, &fScore);
                if (mr == MOK && fScore > fMaxScore) {
                    fMaxScore = fScore;

                    personRecognized = person;
                }
            }
        }

        if (fMaxScore > ARC_FR_SCORE_THRESHOLD) {

        }

    } while (MFalse);

//对人脸识别引擎做销毁
    mr = AFR_FSDK_UninitialEngine(hEngine);
    if(pMemBuffer != MNull)
    {
        MMemFree(MNull,pMemBuffer);         pMemBuffer = MNull;
    }

    return mr;
}

                                
“未来”已来到
更多实用产品等您来创造!
免费使用,持续更新
︿
虹软视觉AI引擎服务交流

Q Q 群

微信群

技术支持:support-api@arcsoft.com
商务合作:business-api@arcsoft.com
论坛交流:虹软引擎开发者互助论坛
QQ交流群: 482124810
地址: 杭州市西湖区西斗门路3号天堂软件园A幢23楼
© 2017 虹软版权所有 浙ICP备11037259号