==虹软官网地址==
http://www.arcsoft.com.cn在官网注册账号,并且申请人脸识别激活码, 选择SDK版本和运行系统(windows/linux/android/ios) ,我们选择windows做测试,申请类型选择1:N ,功能模块包括人脸检测、人脸跟踪、人脸识别。申请之后会获取APP_ID 和SDK_Key,在代码中会用到。
==虹软SDK人脸检测目的==
主要是与face++人脸检测做对比,看能否在face++人脸检测之前选择虹软事先检测一下。
==c++部分功能实现==
选择 Qtcreator 4.2.1 ,新建c++ 库。设置Qt .pro文件```
#不加载Qt库QT -= core gui#生成库名字TARGET = detect_lib#定义生成libTEMPLATE = libDEFINES += DETECT_LIB_LIBRARY
SOURCES += detect_lib.cpp#加载虹软sdk头文件HEADERS += detect_lib.h \ inc/amcomdef.h \ inc/ammem.h \ inc/arcsoft_fsdk_face_detection.h \ inc/asvloffscreen.h \ inc/merror.hunix {
target.path = /usr/lib INSTALLS += target}unix|win32: LIBS += -L$$PWD/lib/ -llibarcsoft_fsdk_face_detection
INCLUDEPATH += $$PWD/.
DEPENDPATH += $$PWD/.```上面是.pro文件,主要是一些配置信息,如生成库名字 加载虹软SDK 和头文件...下面是detect_lib.h文件 主要供nodejs调用的接口文件。
```
#ifndef DETECT_LIB_H#define DETECT_LIB_H# ifdef __cplusplus
# define EXTERN_NAME extern "C"# else# define EXTERN_NAME extern# endif#if defined(WIN32)
# define Q_DECL_EXPORT __declspec(dllexport)# define Q_DECL_IMPORT __declspec(dllexport)#if defined(DETECT_LIB_LIBRARY)# define DETECT_LIBSHARED_EXPORT EXTERN_NAME Q_DECL_EXPORT# else# define DETECT_LIBSHARED_EXPORT EXTERN_NAME Q_DECL_IMPORT#endif#else# define DETECT_LIBSHARED_EXPORT EXTERN_NAME#endifDETECT_LIBSHARED_EXPORT int add(int a,int b);
DETECT_LIBSHARED_EXPORT int detect(unsigned char * data,int width,int height);
#endif // DETECT_LIB_H
```接口add 函数 主要做测试用
int detect(unsigned char * data,int width,int height);
检测人脸函数, data:rgb像素值,width:图片宽度,height:图片高度
detect_lib.cpp```
#include <nan.h>#include "detect_lib.h"using namespace Nan ;using namespace v8; class DetectWorker : public AsyncWorker { public:DetectWorker(Callback *callback, unsigned char* buffer,int width,int height): AsyncWorker(callback), p_buffer(buffer), m_width(width),m_height(height) {m_num = 0;}~DetectWorker() {}//这个函数运行在工作线程,而不是v8线程,所以不能访问v8的数据
void Execute () {//m_num = add(12,3);
m_num = detect(p_buffer,m_width,m_height);// m_num = 5;}
//这个是libuv的回调函数,在这里可以使用v8的数据
void HandleOKCallback () {Local<Object> bmpData = NewBuffer(m_num).ToLocalChecked();
Local<Value> argv[] = { Nan::Null(),Uint32::New(v8::Isolate::GetCurrent(),m_num)}; callback->Call(2, argv);};private:
unsigned char * p_buffer;int m_width;int m_height;int m_num;}; NAN_METHOD(detect){ unsigned char * buffer = (unsigned char*) node::Buffer::Data(info[0]->ToObject());int width = info[1]->Uint32Value();int height = info[2]->Uint32Value();Callback *callback = new Callback(info[3].As<Function>());
AsyncQueueWorker(new DetectWorker(callback, buffer,width ,height));}NAN_MODULE_INIT(Init)
{ Nan::Set(target,New<String>("detect").ToLocalChecked(),GetFunction(New<FunctionTemplate>(detect)).ToLocalChecked());}NODE_MODULE(detect, Init)
```NAN_METHOD(detect) 表示定义接口detect ,js可以直接调用,这里主要是node中的buffer直接以字节的方式传递给c++。也是nodejs与c++交互的重要方式。将编译好的dll 和虹软sdk dll 和detect_lib.h拷贝到当前目录,然后通过node-gyp configure 和node-gyp build 生成.node
至此.node库编译完成,可以使用require直接饮用该.node 如:var detect = require('./build/Release/detect.node');