zoukankan      html  css  js  c++  java
  • 在nodejs中的集成虹软人脸识别

    ==虹软官网地址==
    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');

  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/Zzz-/p/10531542.html
Copyright © 2011-2022 走看看