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


    环境: 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目录)

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181104081453592.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NuZ3dq,size_16,color_FFFFFF,t_70)
    6、添加自己申请的APPID
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/2018110408281461.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NuZ3dq,size_16,color_FFFFFF,t_70)

    /************************************************************************
    * Copyright(c) 2018
    * All rights reserved.
    * File: samplecode.cpp
    * Brief: Powered by ArcSoft
    环境: win10(10.0.16299.0)+ VS2017
    sdk版本:ArcFace v2.0
    x64平台Debug、Release配置都已通过编译
    * Version: 0.1
    * Author: 一念无明
    * Email: cngwj@outlook.com
    * Date: 2018.11.3
    * History:
    2018.11.3 建立项目 
    ************************************************************************/
    #include "pch.h"
    #include "arcsoft_face_sdk.h"//接口文件
    #include "amcomdef.h"//平台文件
    #include "asvloffscreen.h"//平台文件
    #include "merror.h"//错误码文件
    #include <direct.h> //目录操作
    #include <iostream> 
    #include <stdarg.h>
    #include <string>
    #include <opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    #pragma comment(lib, "libarcsoft_face_engine.lib")
    #define APPID ""
    #define SDKKey ""
    #define MERR_ASF_BASE_ALREADY_ACTIVATED 90114 //SDK已激活 
    #define SafeFree(p) { if ((p)) free(p); (p) = NULL; }
    #define SafeArrayDelete(p) { if ((p)) delete [] (p); (p) = NULL; } 
    #define SafeDelete(p) { if ((p)) delete (p); (p) = NULL; } 
    
    int main()
    {
    //激活SDK
    MRESULT res = ASFActivation(APPID, SDKKey);
    if (MOK != res && MERR_ASF_BASE_ALREADY_ACTIVATED != res)
    printf("ALActivation fail: %d
    ", res);
    else
    printf("ALActivation sucess: %d
    ", res);
    
    //初始化引擎
    MHandle handle = NULL;
    MInt32 mask = ASF_FACE_DETECT | ASF_FACERECOGNITION | ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE;
    res = ASFInitEngine(ASF_DETECT_MODE_IMAGE, ASF_OP_0_ONLY, 16, 5, mask, &handle);
    if (res != MOK)
    printf("ALInitEngine fail: %d
    ", res);
    else
    printf("ALInitEngine sucess: %d
    ", res);
    
    // 人脸检测
    IplImage* img = cvLoadImage("../Build\1.bmp");//图片宽度需符合4的倍数
    IplImage* img1 = cvLoadImage("../Build\2.bmp");
    
    if (img && img1)
    {
    ASF_MultiFaceInfo detectedFaces1 = { 0 };//多人脸信息;
    ASF_SingleFaceInfo SingleDetectedFaces1 = { 0 };
    ASF_FaceFeature feature1 = { 0 };
    ASF_FaceFeature copyfeature1 = { 0 };
    res = ASFDetectFaces(handle, img->width, img->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img->imageData, &detectedFaces1);
    if (MOK == res)
    {
    SingleDetectedFaces1.faceRect.left = detectedFaces1.faceRect[0].left;
    SingleDetectedFaces1.faceRect.top = detectedFaces1.faceRect[0].top;
    SingleDetectedFaces1.faceRect.right = detectedFaces1.faceRect[0].right;
    SingleDetectedFaces1.faceRect.bottom = detectedFaces1.faceRect[0].bottom;
    SingleDetectedFaces1.faceOrient = detectedFaces1.faceOrient[0];
    //单人脸特征提取
    res = ASFFaceFeatureExtract(handle, img->width, img->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img->imageData, &SingleDetectedFaces1, &feature1);
    if (res == MOK)
    {
    //拷贝feature
    copyfeature1.featureSize = feature1.featureSize;
    copyfeature1.feature = (MByte *)malloc(feature1.featureSize);
    memset(copyfeature1.feature, 0, feature1.featureSize);
    memcpy(copyfeature1.feature, feature1.feature, feature1.featureSize);
    }
    else
    printf("ASFFaceFeatureExtract 1 fail: %d
    ", res);
    }
    else
    printf("ASFDetectFaces 1 fail: %d
    ", res);
    
    //第二张人脸提取特征
    ASF_MultiFaceInfo	detectedFaces2 = { 0 };
    ASF_SingleFaceInfo SingleDetectedFaces2 = { 0 };
    ASF_FaceFeature feature2 = { 0 };
    res = ASFDetectFaces(handle, img1->width, img1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img1->imageData, &detectedFaces2);
    if (MOK == res)
    {
    SingleDetectedFaces2.faceRect.left = detectedFaces2.faceRect[0].left;
    SingleDetectedFaces2.faceRect.top = detectedFaces2.faceRect[0].top;
    SingleDetectedFaces2.faceRect.right = detectedFaces2.faceRect[0].right;
    SingleDetectedFaces2.faceRect.bottom = detectedFaces2.faceRect[0].bottom;
    SingleDetectedFaces2.faceOrient = detectedFaces2.faceOrient[0];
    
    res = ASFFaceFeatureExtract(handle, img1->width, img1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img1->imageData, &SingleDetectedFaces2, &feature2);
    if (MOK != res)
    printf("ASFFaceFeatureExtract 2 fail: %d
    ", res);
    }
    else
    printf("ASFDetectFaces 2 fail: %d
    ", res);
    
    // 单人脸特征比对
    MFloat confidenceLevel;
    res = ASFFaceFeatureCompare(handle, &copyfeature1, &feature2, &confidenceLevel);
    if (res != MOK)
    printf("ASFFaceFeatureCompare fail: %d
    ", res);
    else
    printf("ASFFaceFeatureCompare sucess: %lf
    ", confidenceLevel);
    
    // 人脸信息检测
    MInt32 processMask = ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE;
    res = ASFProcess(handle, img1->width, img1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img1->imageData, &detectedFaces1, processMask);
    if (res != MOK)
    printf("ASFProcess fail: %d
    ", res);
    else
    printf("ASFProcess sucess: %d
    ", res);
    
    // 获取年龄
    ASF_AgeInfo ageInfo = { 0 };
    res = ASFGetAge(handle, &ageInfo);
    //printf("年龄: %d
    ", ageInfo);
    if (res != MOK)
    printf("ASFGetAge fail: %d
    ", res);
    else
    printf("ASFGetAge sucess: %d
    ", res);
    
    // 获取性别
    ASF_GenderInfo genderInfo = { 0 };
    res = ASFGetGender(handle, &genderInfo);
    if (res != MOK)
    printf("ASFGetGender fail: %d
    ", res);
    else
    printf("ASFGetGender sucess: %d
    ", res);
    
    // 获取3D角度
    ASF_Face3DAngle angleInfo = { 0 };
    res = ASFGetFace3DAngle(handle, &angleInfo);
    if (res != MOK)
    printf("ASFGetFace3DAngle fail: %d
    ", res);
    else
    printf("ASFGetFace3DAngle sucess: %d
    ", res);
    
    SafeFree(copyfeature1.feature);	//释放内存
    }
    
    //获取版本信息
    const ASF_VERSION* pVersionInfo = ASFGetVersion(handle);
    printf("版本号: %s
    ", pVersionInfo->Version);
    
    //反初始化
    res = ASFUninitEngine(handle);
    if (res != MOK)
    printf("ALUninitEngine fail: %d
    ", res);
    else
    printf("ALUninitEngine sucess: %d
    ", res);
    
    getchar();
    return 0;
    }
    

      

    用其它照片测试需要注意图片的宽度
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181104084526901.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NuZ3dq,size_16,color_FFFFFF,t_70)

  • 相关阅读:
    身份证号校验和社会信用代码校验
    oracle导入sql文件
    Tomcat报java.lang.OutOfMemoryError: PermGen space有效解决方法
    oracle如何导出含有CLOB格式字段的长字符串数据
    oracle定时任务
    table表格合并列中相同的内容栏
    Oracle解析复杂json的方法
    Your project does not reference .NETFramework,Version=v4.6.1 framework
    在windows下安装git中文版客户端并连接gitlab
    VS2017 中更改项目名称
  • 原文地址:https://www.cnblogs.com/Zzz-/p/10762051.html
Copyright © 2020-2023  润新知