代码改变世界

虹软离线人脸识别 ArcFace 2.0 Demo [C++]

2018-11-04 08:52  纸浅躬行  阅读(945)  评论(0)    收藏  举报

    环境: win10(10.0.16299.0)+ VS2017
    sdk版本:ArcFace v2.0
    OPENCV3.43版本
    x64平台Debug、Release配置都已通过编译

下载地址:https://download.csdn.net/download/cngwj/10763108

运行动画效果

 


配置过程

->0x01  下载sdk:

  虹安sdk https://ai.arcsoft.com.cn

 

->0x02  工程配置:

1、 添加工程的头文件目录:

a) 右键单击工程名, 选择属性---配置属性---c/c++---常规---附加包含目录

b) 添加头文件存放目录

2、 添加文件引用的 lib 静态库路径:

a) 右键单击工程名,选择属性---配置属性---链接器---常规---附加库目录

b) 添加 lib 文件存放

3、 添加工程引用的 lib 库:
a) 右键单击工程名,选择属性---配置属性---链接器---输入---附加依赖项
b) 添加依赖的 lib 库名称

4、自定义可执行文件输出目录

5、 添加工程引用的 dll 动态库:

a) 把引用的 dll 放到工程的可执行文件所在的目录下(复制到Build目录)

6、添加自己申请的APPID

 

->0x03  参考代码

  1 /************************************************************************
  2 * Copyright(c) 2018
  3 * All rights reserved.
  4 * File: samplecode.cpp
  5 * Brief: Powered by ArcSoft
  6     环境: win10(10.0.16299.0)+ VS2017
  7     sdk版本:ArcFace v2.0
  8     x64平台Debug、Release配置都已通过编译
  9 * Version: 0.1
 10 * Author: 一念无明
 11 * Email: cngwj@outlook.com
 12 * Date: 2018.11.3
 13 * History:
 14 2018.11.3 建立项目 
 15 ************************************************************************/
 16 #include "pch.h"
 17 #include "arcsoft_face_sdk.h"//接口文件
 18 #include "amcomdef.h"//平台文件
 19 #include "asvloffscreen.h"//平台文件
 20 #include "merror.h"//错误码文件
 21 #include <direct.h> //目录操作
 22 #include <iostream>  
 23 #include <stdarg.h>
 24 #include <string>
 25 #include <opencv.hpp>
 26  
 27 using namespace std;
 28 using namespace cv;
 29  
 30 #pragma comment(lib, "libarcsoft_face_engine.lib")
 31 #define APPID ""
 32 #define SDKKey ""
 33 #define MERR_ASF_BASE_ALREADY_ACTIVATED 90114 //SDK已激活     
 34 #define SafeFree(p) { if ((p)) free(p); (p) = NULL; }
 35 #define SafeArrayDelete(p) { if ((p)) delete [] (p); (p) = NULL; } 
 36 #define SafeDelete(p) { if ((p)) delete (p); (p) = NULL; } 
 37  
 38 int main()
 39 {
 40     //激活SDK
 41     MRESULT res = ASFActivation(APPID, SDKKey);
 42     if (MOK != res && MERR_ASF_BASE_ALREADY_ACTIVATED != res)
 43         printf("ALActivation fail: %d\n", res);
 44     else
 45         printf("ALActivation sucess: %d\n", res);
 46  
 47     //初始化引擎
 48     MHandle handle = NULL;
 49     MInt32 mask = ASF_FACE_DETECT | ASF_FACERECOGNITION | ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE;
 50     res = ASFInitEngine(ASF_DETECT_MODE_IMAGE, ASF_OP_0_ONLY, 16, 5, mask, &handle);
 51     if (res != MOK)
 52         printf("ALInitEngine fail: %d\n", res);
 53     else
 54         printf("ALInitEngine sucess: %d\n", res);
 55  
 56     // 人脸检测
 57     IplImage* img = cvLoadImage("../Build\\1.bmp");//图片宽度需符合4的倍数
 58     IplImage* img1 = cvLoadImage("../Build\\2.bmp");
 59  
 60     if (img && img1)
 61     {
 62         ASF_MultiFaceInfo detectedFaces1 = { 0 };//多人脸信息;
 63         ASF_SingleFaceInfo SingleDetectedFaces1 = { 0 };
 64         ASF_FaceFeature feature1 = { 0 };
 65         ASF_FaceFeature copyfeature1 = { 0 };
 66         res = ASFDetectFaces(handle, img->width, img->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img->imageData, &detectedFaces1);
 67         if (MOK == res)
 68         {
 69             SingleDetectedFaces1.faceRect.left = detectedFaces1.faceRect[0].left;
 70             SingleDetectedFaces1.faceRect.top = detectedFaces1.faceRect[0].top;
 71             SingleDetectedFaces1.faceRect.right = detectedFaces1.faceRect[0].right;
 72             SingleDetectedFaces1.faceRect.bottom = detectedFaces1.faceRect[0].bottom;
 73             SingleDetectedFaces1.faceOrient = detectedFaces1.faceOrient[0];
 74             //单人脸特征提取
 75             res = ASFFaceFeatureExtract(handle, img->width, img->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img->imageData, &SingleDetectedFaces1, &feature1);
 76             if (res == MOK)
 77             {
 78                 //拷贝feature
 79                 copyfeature1.featureSize = feature1.featureSize;
 80                 copyfeature1.feature = (MByte *)malloc(feature1.featureSize);
 81                 memset(copyfeature1.feature, 0, feature1.featureSize);
 82                 memcpy(copyfeature1.feature, feature1.feature, feature1.featureSize);
 83             }
 84             else
 85                 printf("ASFFaceFeatureExtract 1 fail: %d\n", res);
 86         }
 87         else
 88             printf("ASFDetectFaces 1 fail: %d\n", res);
 89  
 90         //第二张人脸提取特征
 91         ASF_MultiFaceInfo    detectedFaces2 = { 0 };
 92         ASF_SingleFaceInfo SingleDetectedFaces2 = { 0 };
 93         ASF_FaceFeature feature2 = { 0 };
 94         res = ASFDetectFaces(handle, img1->width, img1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img1->imageData, &detectedFaces2);
 95         if (MOK == res)
 96         {
 97             SingleDetectedFaces2.faceRect.left = detectedFaces2.faceRect[0].left;
 98             SingleDetectedFaces2.faceRect.top = detectedFaces2.faceRect[0].top;
 99             SingleDetectedFaces2.faceRect.right = detectedFaces2.faceRect[0].right;
100             SingleDetectedFaces2.faceRect.bottom = detectedFaces2.faceRect[0].bottom;
101             SingleDetectedFaces2.faceOrient = detectedFaces2.faceOrient[0];
102  
103             res = ASFFaceFeatureExtract(handle, img1->width, img1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img1->imageData, &SingleDetectedFaces2, &feature2);
104             if (MOK != res)
105                 printf("ASFFaceFeatureExtract 2 fail: %d\n", res);
106         }
107         else
108             printf("ASFDetectFaces 2 fail: %d\n", res);
109  
110         // 单人脸特征比对
111         MFloat confidenceLevel;
112         res = ASFFaceFeatureCompare(handle, &copyfeature1, &feature2, &confidenceLevel);
113         if (res != MOK)
114             printf("ASFFaceFeatureCompare fail: %d\n", res);
115         else
116             printf("ASFFaceFeatureCompare sucess: %lf\n", confidenceLevel);
117  
118         // 人脸信息检测
119         MInt32 processMask = ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE;
120         res = ASFProcess(handle, img1->width, img1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img1->imageData, &detectedFaces1, processMask);
121         if (res != MOK)
122             printf("ASFProcess fail: %d\n", res);
123         else
124             printf("ASFProcess sucess: %d\n", res);
125  
126         // 获取年龄
127         ASF_AgeInfo ageInfo = { 0 };
128         res = ASFGetAge(handle, &ageInfo);
129         //printf("年龄: %d\n", ageInfo);
130         if (res != MOK)
131             printf("ASFGetAge fail: %d\n", res);
132         else
133             printf("ASFGetAge sucess: %d\n", res);
134  
135         // 获取性别
136         ASF_GenderInfo genderInfo = { 0 };
137         res = ASFGetGender(handle, &genderInfo);
138         if (res != MOK)
139             printf("ASFGetGender fail: %d\n", res);
140         else
141             printf("ASFGetGender sucess: %d\n", res);
142  
143         // 获取3D角度
144         ASF_Face3DAngle angleInfo = { 0 };
145         res = ASFGetFace3DAngle(handle, &angleInfo);
146         if (res != MOK)
147             printf("ASFGetFace3DAngle fail: %d\n", res);
148         else
149             printf("ASFGetFace3DAngle sucess: %d\n", res);
150  
151         SafeFree(copyfeature1.feature);        //释放内存
152     }
153  
154     //获取版本信息
155     const ASF_VERSION* pVersionInfo = ASFGetVersion(handle);
156     printf("版本号: %s\n", pVersionInfo->Version);
157  
158     //反初始化
159     res = ASFUninitEngine(handle);
160     if (res != MOK)
161         printf("ALUninitEngine fail: %d\n", res);
162     else
163         printf("ALUninitEngine sucess: %d\n", res);
164  
165     getchar();
166     return 0;
167 }
168  

 

用其它照片测试需要注意图片的宽度