相关说明

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++ ->常规->附加包含目录

...\Embedded\common\src

...\FaceRecEm\common\src

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\n");
return NULL;
}
int initDataSize = fread(initData, , MAX_FILE_SIZE, filedesc);
fclose(filedesc);

产生错误:

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

错误原因:

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

产生错误:

1>embedded\common\src\b_imageem\ToneDownBGSupp.c(399): error C2198: “bbs_Int32Arr_init”: 用于调用的参数太少

1>embedded\common\src\b_imageem\HistoEq16.c(79): error C2065: “cpA”: 未声明的标识符

错误原因:

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

产生警告:

1>facerecem\common\src\b_fdsdk\SDK.c(91): warning C4273: “btk_SDK_defaultParam”: dll 链接不一致

1>          c:\users\d\desktop\libneven\neven-master\facerecem\common\src\b_fdsdk\SDK.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>Debug\Functions.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定

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

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

1>Debug\Functions.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

[20160711][neven代码移植Windows]的更多相关文章

  1. 将Linux代码移植到Windows的简单方法

    一.前言 Linux拥有丰富各种源代码资源,但是大部分代码在Windows平台情况是无法正常编译的.Windows平台根本无法直接利用这些源代码资源.如果想要使用完整的代码,就要做移植工作.因为C/C ...

  2. 使用Phoenix将SQL代码移植至HBase

    1.前言 HBase是云计算环境下最重要的NOSQL数据库,提供了基于Hadoop的数据存储.索引.查询,其最大的优点就是可以通过硬件的扩展从而几乎无限的扩展其存储和检索能力.但是HBase与传统的基 ...

  3. CUDA代码移植

    如果CUDA的代码移植,一个是要 include文件夹对不对,这个是.h文件能否找到的关键,另一个就是lib,这个是.lib文件能否找到的关键.具体检查地方,见下头. include: lib:

  4. Windows GUI代码与Windows消息问题调试利器

    Windows GUI代码与Windows消息问题调试利器 记得很久前有这么一种说法: 人类区别于动物的标准就是工具的使用.同样在软件开发这个行业里面,对于工具的使用也是高手和入门级选手的主要区别,高 ...

  5. C#代码安装Windows服务(控制台应用集成Windows服务)

    最近在为一款C/S架构的科研软件开发云计算版,需要用到WCF,考虑到不需要什么界面以及稳定性,无人值守性,准备用Windows Service作为宿主,无奈Windows Service的安装太为繁复 ...

  6. 代码移植的福音 namespace_alias

    命名空间别名 允许程序员定义命名空间的另一个名字 它们常用作长的或嵌套过深的命名空间的简便使用方式. 我们也可以将用在代码移植上,而无需修改源代码的文件所定义的命名空间, 为后面升级merge代码创造 ...

  7. VC6.0代码移植到VS2008运行时乱码问题解决

    转载:http://blog.sina.com.cn/s/blog_6d0cbb030101a3cs.html 问题描述:     之前用VC6.0写过一个OpenGL的程序,后来需要将其放到VS20 ...

  8. Unity3D移植Windows Universal App(Windows 8.1 及Windows Phone 8.1)版本遇到的坑

    移植的情况以及遇到的问题: 1.选用的版本是最新的Unity5.0. 2.全屏播放视频Handheld.PlayFullScreenMoview的路径必须是全路径,并且前面要加上"ms-ap ...

  9. Asp.net Core的代码移植技巧,半天将SqlSugarORM转成Core

    .net  core中有哪些被抛弃的类 1.DataTable DataRow SqlDataAdapter DataRow DataColumn DataColumn 虽然这些类不是我ORM核心功能 ...

随机推荐

  1. bzoj 4012: [HNOI2015]开店

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

  2. JavaScript构造函数、继承的理解

    前两天稍微深入一点点理解了原型和原型链,然后就开始有挺多疑问的: function dog() { this.name = "huahua"; } var cat = new do ...

  3. 【quickhybrid】iOS端的项目实现

    前言 18年元旦三天内和朋友突击了下,勉强是将雏形做出来了,后续的API慢慢完善.(当然了,主力还是那个朋友,本人只是初涉iOS,勉强能看懂,修修改改而已) 大致内容如下: JSBridge核心交互部 ...

  4. Linux(CentOS6.5)下编译Popt报错”GNU gettext is required. The latest version”(gettext已经编译安装,但是没有安装在默认目录)的解决方案

    本文地址http://comexchan.cnblogs.com/,作者Comex Chan,尊重知识产权,转载请注明出处,谢谢!   背景: 编译popt的时候出现下述报错. 直接vi查看confi ...

  5. JAVA类的创建: 创建JAVA的类 ,JAVA的字段,JAVA类的方法

    1. 创建Java的类 如果说Java的一切都是对象,那么类型就是决定了某一类对象的外观与行为.可是类型的关键字不是type,而是class,创建一个新的类型要用下面的代码: 1 2 3 class ...

  6. Web App、Hybrid App与Native App

    在这个App的时代,转战了前端,一直接触的都是pc, 离out不远了. 那么接下来,app是我接下来半年的重点,为什么是半年,因为时间不多了. 因为是前端,那么我的重心肯定是 Web App, Hyb ...

  7. iPhone X 适配

    背景 iPhone X 刘海机于9月13日发布,给科技小春晚带来一波高潮.作为开发人员却多出来一份忧虑,iPhone X 怎么适配?我们 App 的脑袋会不会也长一刘海出来?Tabbar 会不会被圆角 ...

  8. 云计算之路-阿里云上: RDS实例CPU跑满引发的故障

    今天上午 10: 40 左右,我们所使用的阿里云 RDS 实例的 CPU 突然飙高到近 100% ,造成大量数据库查询操作缓慢.超时,在这个恶劣条件下大量 memcached 缓存无法建立,这样的雪上 ...

  9. 【转自Testerhome】iOS 真机如何安装 WebDriverAgent

    开始 尽量升级Xcode到最新版,保持iPhone的版本大于9.3 从github上下载代码 git clone https://github.com/facebook/WebDriverAgent ...

  10. mac安装mysql的两种方法(含配置)

    1.使用安装包安装mysql 双击打开安装文件 双击pkg文件安装 一路向下,记得保存最后弹出框中的密码(它是你mysql root账号的密码) 正常情况下,安装成功. 此时只是安装成功,但还需要额外 ...