zoukankan      html  css  js  c++  java
  • [20160711][neven代码移植Windows]

    相关说明

        neven代码用于人脸检测,该代码是从Android源代码中抽取出来的,可以在Linux系统下通过make命令直接进行编译,并且可以通过代码中opencv目录下的测试文件进行测试。

    移植环境

    操作系统:Win7 64位

    移植软件:Visual Studio 2012

    代码下载:https://github.com/lqs/neven

    操作步骤

    1.下载并且解压源代码

    2.打开Visual Studio 2012,从现有代码中新建项目

    2.1.文件->新建->项目

    2.3.选择生成动态运行库

    3.拷贝neven代码到项目中

    4.添加neven代码带项目中

    选择显示所有文件,然后右键包含代码到项目中

    5.设置项目相关配置

    5.1.配置搜索头文件路径

    调试->属性->C/C++ ->常规->附加包含目录

    ...Embeddedcommonsrc

    ...FaceRecEmcommonsrc

     

    5.2.运行生成命令

    生成->生成解决方案

    产生错误:

    1>neven.c(19): warning C4013: “open”未定义;假设外部返回 int

    错误原因:

    在代码中操作文件的方式采用的是Linux系统调用,可以用标准C库操作文件方式替代。

    修改代码:

    FILE* filedesc = fopen(descfile, "rb");
    if (filedesc == NULL) {
        LOGE("ERROR: unable to load describe file
    ");
        return NULL;
    }
    int initDataSize = fread(initData, 1, MAX_FILE_SIZE, filedesc);
    fclose(filedesc);

    产生错误:

    1>neven.c(24): error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

    错误原因:

    标准C中不支持变量定义在语句后面。可以通过修改neven.c为neven.cpp来解决。

    产生错误:

    1>embeddedcommonsrc_imageemToneDownBGSupp.c(399): error C2198: “bbs_Int32Arr_init”: 用于调用的参数太少

    1>embeddedcommonsrc_imageemHistoEq16.c(79): error C2065: “cpA”: 未声明的标识符

    错误原因:

    这两个源文件并不需要被编译进动态库中,可以直接从项目中删除。

    产生警告:

    1>facerecemcommonsrc_fdsdkSDK.c(91): warning C4273: “btk_SDK_defaultParam”: dll 链接不一致

    1>          c:usersddesktoplibneven even-masterfacerecemcommonsrc_fdsdkSDK.h(93) : 参见“btk_SDK_defaultParam”的前一个定义

    警告原因:

    导出函式__declspec(dllexport)在dll中使用

    导入函式__declspec(dllimport)在要调用dll的程序中使用

    通过添加预处理定义来消除该警告,避免下面产生的链接错误。

    操作方式:

    调试->属性->C/C++ ->预处理器->预处理定义,添加btk_EXPORTING宏定义

    产生警告:

    1>neven.cpp(19): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

    警告原因:

    fopen函数不安全,通过添加预处理定义来消除该警告。

    操作方式:

    调试->属性->C/C++ ->预处理器->预处理定义,添加_CRT_SECURE_NO_WARNINGS宏定义

    产生错误:

    1>neven.cpp(64): error C2440: “初始化”: 无法从“void *”转换为“neven_env *”

    错误原因:

    malloc返回void*指针无法转换为struct neven_env *类型,可以通过强制转换消除该错误。

    修改代码:

    struct neven_env *env = (struct neven_env *)malloc(sizeof(struct neven_env));

    产生警告:

    1>DebugFunctions.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定

    1>DebugFunctions.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定

    1>DebugFunctions.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定

    1>DebugFunctions.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定

    警告原因:

    代码中有多同名的functions.c文件,然而产生obj文件的路径都是一样的,这样就导致不同的functions.obj文件被覆盖,参数后面的链接错误error LNK2001: 无法解析的外部符号 _bbs_memWrite32。可以通过修改产生不同的obj路径来解决这个问题。

    操作方式:

    调试->属性->C/C++ ->输出文件->对象文件名,修改为$(IntDir)%(RelativeDir)。表示生成的obj文件存放在debug文件夹下对应的文件夹中。

    5.3. 应用程序引用DLL动态链接库时需要在neven.h头文件中添加相关代码,使外部程序可以调用DLL。

    调试->属性->C/C++ ->预处理器->预处理定义,添加neven_EXPORTING宏定义

    #ifndef _NEVEN_H
    #define _NEVEN_H
    
    #include "b_FDSDK/fd_emb_sdk.h"
    
    #ifdef neven_EXPORTING
        #define neven_DECLSPEC __declspec(dllexport) 
    #else
        #define neven_DECLSPEC __declspec(dllimport) 
    #endif
    
    struct neven_env {
            btk_HFaceFinder fd;
            btk_HSDK sdk;
            btk_HDCR dcr;
            int width;
            int height;
    };
    
    struct neven_face {
            float confidence;
            float midpointx;
            float midpointy;
            float eyedist;
    };
    
    neven_DECLSPEC
    struct neven_env *neven_create(const char* descfile, int w, int h, int maxFaces);
    
    neven_DECLSPEC
    void neven_destroy(struct neven_env *env);
    
    neven_DECLSPEC
    int neven_detect(struct neven_env *env, void *bwbuffer);
    
    neven_DECLSPEC
    void neven_get_face(struct neven_env *env, struct neven_face *face, int index);
    
    #endif

    4.大功告成,在debug文件夹中生成neven.lib和neven.dll动态链接库。动态链接库的编程方式参考:

    https://msdn.microsoft.com/zh-cn/library/ms235636.aspx

    Congratulation! Let’s enjoy!

    参考网址:

    http://m.blog.csdn.net/article/details?id=50706480

    http://jingyan.baidu.com/article/49711c616b8a1ffa441b7cdc.html

    http://blog.csdn.net/timmy_zhou/article/details/7284110

    http://bbs.csdn.net/topics/10130947

    http://blog.csdn.net/mniwc/article/details/7993361

  • 相关阅读:
    java 实现敏感词(sensitive word)工具详解使用说明
    一键自动生成 java junit 测试代码神器 gen-test-plugin 入门介绍
    基于 asm 实现比 spring BeanUtils 性能更好的属性拷贝框架
    java 反射借助 asm 获取参数名称最优雅简单的方式
    xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml
    从零开始手写 spring ioc 框架,深入学习 spring 源码
    java property 配置文件管理工具框架,避免写入 property 乱序
    从零开始手写 dubbo rpc 框架
    java bean 属性验证框架 valid
    vue安装及测试mockjs
  • 原文地址:https://www.cnblogs.com/d442130165/p/5660742.html
Copyright © 2011-2022 走看看