==虹软官网地址==
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
#定义生成lib
TEMPLATE = lib

DEFINES += 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.h

unix {
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
#endif

DETECT_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');

最新文章

  1. 在VPS上搭建SS访问火星
  2. [MongoDB]mapReduce
  3. [BZOJ 3145][Feyat cup 1.5]Str 解题报告
  4. 套接字I/O模型-select
  5. 教程:如何减小iOS应用程序的大小?
  6. C++:对象数组
  7. Android:OptionMenu
  8. 关于android的nfc问题
  9. 2014辽宁ACM省赛 Prime Factors
  10. Hadoop权威指南:HDFS-写入数据
  11. Redis 4.0新功能介绍
  12. vue mock
  13. vue中引入js,然后new js里的方法
  14. RSEG用法和汇编问号的涵义
  15. 压缩图片 Image
  16. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十):服务熔断(Hystrix、Turbine)
  17. ubuntu下安装pdf编辑器Master PDF Editor
  18. java关键字总结
  19. centos7 部署elasticsearch
  20. 20145304 网络对抗技术 逆向与Bof基础

热门文章

  1. python基础:re模块匹配时贪婪和非贪婪模式
  2. Python生成目录树代码
  3. 2018-2019-1 20189206 《Linux内核原理与分析》第七周作业
  4. 20145208 蔡野 《网络对抗》Exp8 Web基础
  5. 20145325张梓靖 《网络对抗技术》 PC平台逆向破解
  6. Codeforces 866C Gotta Go Fast - 动态规划 - 概率与期望 - 二分答案
  7. 【python004-分支循环】
  8. 学习模型-视图-控制器MVC模式
  9. 洛谷luogu2782
  10. POJ 2226 Muddy Fields(最小点覆盖)题解