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

  • 相关阅读:
    ssh
    ssh免密码登陆
    滑雪[dp]
    Help Jimmy[dp]
    动态规划 [子序列问题]
    最佳加法表达式 [dp]
    求排列的逆序数[归并排序]
    输出前m大个数,时间复杂度O(n+mlog(m)) [快排]
    不会递归?五道例题教你如何递归
    函数模板的琐碎笔记
  • 原文地址:https://www.cnblogs.com/Zzz-/p/10531542.html
Copyright © 2011-2022 走看看