前几天在偶然网上看到虹软人脸识别的的SDK,可以离线使用,故下载下来体验了一样,效果还是挺不错的,下面将本人使用安装使用的过程记录于此,方便参考!
首先去虹软官网下载SDK开发包,这个需要实名注册一下,不过还是挺快的。下面本人以vs2015为例,本人下载的是64位的,32位的配置也一样,展开详细介绍。
将官网下载的开发包解压,新建一个项目,然后点击项目属性,将inc目录的头文件添加到附加包含目录里面
同理添加附加库目录,如下图所示
附加依赖项:
将两个dll复制到程序运行的目录里面
按照上面的步骤配置完环境后,接下来进行测试(图片的读取要用到opencv,我就假设大家opencv配置均不存在问题),下面的代码为我参考的官方给的一些资料,但是我用的opencv是3.4的,因此程序有些小小的改动,具体可参考如下的代码!
#include<iostream>
#include<opencv2/opencv.hpp>
#include "arcsoft_face_sdk.h"
#include "amcomdef.h"
#include "asvloffscreen.h"
#include "merror.h"
#include <iostream>
#include <stdarg.h>
#include <string>
using namespace std;
using namespace cv;
#pragma comment(lib, "libarcsoft_face_engine.lib")
#define APPID "官网下载的APPID"
#define SDKKey "官网下载的APPKEY"
#define MERR_ASF_BASE_ALREADY_ACTIVATED 90114
#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 (res!= MOK && MERR_ASF_BASE_ALREADY_ACTIVATED != res)
printf("ALActivation fail: %d\n", res);
else
printf("ALActivation sucess: %d\n", 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\n", res);
else
printf("ALInitEngine sucess: %d\n", res);
Mat img = imread("c:\\users\\x\\desktop\\人脸识别\\m.jpg");
ASF_MultiFaceInfo detectedFaces1;
ASF_SingleFaceInfo SingleDetectedFaces1 ;
ASF_FaceFeature feature1 ;
ASF_FaceFeature copyfeature1 ;
res = ASFDetectFaces(handle, img.cols, img.rows, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img.ptr<uchar>(0), &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];
int a = SingleDetectedFaces1.faceRect.left;
int b = SingleDetectedFaces1.faceRect.right;
int c = SingleDetectedFaces1.faceRect.top;
int d = SingleDetectedFaces1.faceRect.bottom;
rectangle(img, Rect(a, c, (b - a), (d - c)), Scalar(0, 0, 255), 4);
imshow("out", img);
waitKey(20);
}
// 人脸信息检测
MInt32 processMask = ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE;
res = ASFProcess(handle, img.cols, img.rows, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)img.ptr<uchar>(0), &detectedFaces1, processMask);
if (res == MOK)
{
cout << "人脸信息检测成功" << endl;
}
// 获取年龄
ASF_AgeInfo ageInfo = { 0 };
res = ASFGetAge(handle, &ageInfo);
if (res != MOK)
printf("ASFGetAge fail: %d\n", res);
else
cout <<"年龄检测结果:"<< *ageInfo.ageArray << endl;
// 获取性别
ASF_GenderInfo genderInfo = { 0 };
res = ASFGetGender(handle, &genderInfo);
if (res != MOK)
printf("ASFGetGender fail: %d\n", res);
else
{
if (*genderInfo.genderArray == 0)
{
cout << "性别检测结果:男性" << endl;
}
if (*genderInfo.genderArray == 1)
{
cout << "性别检测结果:女性" << endl;
}
}
// 获取3D角度
ASF_Face3DAngle angleInfo = { 0 };
res = ASFGetFace3DAngle(handle, &angleInfo);
if (res != MOK)
cout << "获得3D角度失败" << endl;
else
cout << "roll=" << angleInfo.roll[0] << endl;
cout << "yaw=" << angleInfo.yaw[0] << endl;
cout << "pitch=" << angleInfo.pitch[0] << endl;
system("pause");
return 0;
}
下面是我运行上述程序的结果!
上述的就是简单的一个C++ demo,更多的用法还可参考官网开发文档,祝大家体验愉快!