Opencv-Markerless-AR+windows+vs2015

来源:互联网 发布:数控自动编程软件 编辑:程序博客网 时间:2024/06/11 05:52

从GitHub上下载资源https://github.com/meiroo/opencv-markerless-AR

但是从这个网址上下载的资源好像有错误,故我又从GitHub上下载了另外一份资源https://github.com/takmin/OpenCV-Marker-less-AR

我将这一份的src替换了上一个重复的内容(因为之前库没配好,所以具体有什么样子的错误我不知道)

打开src中的install.txt可以看到这个demo需要

1.opencv,我的是2.4.13,安装好就可以了

2.GLUT3.7.6,我并没有安装这个库,直接从网上下载了一份包含动态链接库和头文件的glutdlls37beta.zip,

然后将压缩包内的glut.h放到.../Microsoft Visual Studio/VC98/Include/GL目录下

将glut32.lib放到.../Microsoft Visual Studio/VC98/Lib目录下
将glut32.dll放到X:/windows/systom32目录下(win98用户放到X:/windows/systom目录下)

具体的可以见http://blog.csdn.net/popkiler/article/details/1754276。

这样就配置好了。

3.GLMetaseq,这边说它需要libpng和zlib,因为我的opencv是通过cmake安装的,所以源码安装的我不清楚,但是我这样安装是没有把这两个库安装好的。所以我又在网上找libpng和zlib的安装方法。libpng需要使用zlib这个库,所以先安装zlib。

zlib    下载地址http://download.chinaunix.net/download.php?id=40893&ResourceID=12241

按照http://blog.csdn.net/jinxinliu1/article/details/42423035这个方法


本文主要介绍在Windows 7 64bit操作系统下,利用Visual Studio 2010,如何安装,生成,并使用zlib 1.2.5。
(1). 首先,使用Visual Studio 2010编译生成zlib 1.2.5版本的静态和动态链接库。
(2). 然后,通过加载静态链接库zlibstat.lib,实现对简单txt文档的压缩与解压缩。
(3). 最后,通过调用动态链接库zlibwapi.lib,实现对简单txt文档的压缩与解压缩。

1. 使用Visual Studio 2010编译生成zlib 1.2.5版本
   1). 从zlib官网 "http://zlib.NET/"
       下载最新版本的zlib "http://zlib.Net/zlib-1.2.5.tar.gz"
       解压,展开到系统盘。
   2). 在编译前,首先开启VS2010的Command Prompt (32bit)

   3). 进入到zlib-1.2.5contrib\masmx86目录 "zlib-1.2.5\contrib\masmx86",执行bld_ml32.bat。

   4). 这一步运行bld_ml32批处理文件,里面调用ml命令编译inffas32.asm和match686.asm,生成inffas32.obj和match686.obj。这两个文件在zlibvc中用到。

    5). 若是准备生成64位库,则进入到zlib-1.2.5contrib\masmx64目录 "zlib-1.2.5\contrib\masmx64",执行bld_ml64.bat。注意ml64.exe在vs2010的"Microsoft Visual Studio 10.0/VC/bin"下面找不到。我们需要使用"Microsoft Visual Studio 10.0/VC/bin/amd64/"下面的ml64.exe。这里可以简单将其复制到目录 "zlib-1.2.5\contrib\masmx64"下面(汗颜啊)。

       这一步运行bld_ml64批处理文件,里面调用ml命令编译gvmat64.asm和inffasx64.asm,生成gvmat64.obj和inffasx64.obj。这两个文件在zlibvc中用到。

   6). zlib的vs sln解决方案文件可以在如下路径中找到 "zlib-1.2.5\contrib\vstudio\vc10\zlibvc.sln"

在工具栏中将“解决方案平台”改为“x64”,编译即可

       这个解决方案中包含6个工程。其中:

       (1). zlibvc生成动态链接库zlibwapi.dll和对应的导入库zlibwapi.lib

注意:如果出现zlibvc.def(4): fatal error LNK1118: “VERSION语句中的语法错误,将VERSION删除再编译一次即可!

             如果出现 VS2012:error LNK2026: 模块对于 SAFESEH 映像是不安全的

解决方法:打开该项目的“属性页”对话框-->单击“链接器”节点-->单击“命令行”属性页--> /SAFESEH:NO 键入“附加选项”框中,然后点击应

       (2). zlibstat生成静态链接库zlibstat.lib

       (3). testzlibdll测试生成的动态链接库zlibwapi.dll

       (4). testzlib测试生成的静态链接库zlibstat.lib        

       最后我们在debug模式下编译整个解决方案。生成的dll和lib文件可在如下文件夹中找到

       "zlib-1.2.5\contrib\vstudio\vc10\x86"

       为了随后的调试方便,在随后的例子中,我们把头文件zconf.h,zlib.h放到如下文件夹

       "C:\MANUS\CommonSpace\zlib 1.2.5" 

       库文件zlibwapi.dll,zlibwapi.lib,zlibstat.lib放到如下文件夹

       "C:\MANUS\CommonSpace\zlib 1.2.5\Lib Debug" 


2. 通过加载静态链接库zlibstat.lib使用zlib

   1). 打开Visual Studio 2010,建立一个Win32 Console Application工程,假设名字是test

   2). 打开"zlib-1.2.5-2\contrib\testzlib\testzlib.c",打开,将其内容复制到新建工程的test.cpp中。

       注意保留 #include "stdafx.h"

       将"if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)"改为

         "if (ReadFileMemory(argv[1],&lFileSize,(void**)&FilePtr)==0)"

   3). 打开Project -> Property (Alt+F7),在Configuration Properties -> C/C++ -> General -> Additional Include Directories 中增加 "C:\MANUS\CommonSpace\zlib 1.2.5"。我们已经把头文件zconf.h,zlib.h放到这个文件夹中。

   4). 在Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions 中增加 "ASMV, ASMINF, ZLIB_WINAPI"。根据官方文档,1.2.5版本需要定义ZLIB_WINAPI。

   5). 在Configuration Properties -> Linker -> General -> Additional Include Directories 中增加 "C:\MANUS\CommonSpace\zlib 1.2.5\Lib Debug"。我们已经把库文件zlibwapi.dll,zlibwapi.lib,zlibstat.lib放到这个文件夹中。Windows <wbr>7 <wbr>64bit和Visual <wbr>Studio <wbr>2010下安装及使用Zlib <wbr>1.2.5

   6). 在Configuration Properties -> Linker -> Input -> Additional Dependencies 中增加 "zlibstat.lib"。这个是静态链接库。

   7). 编译,生成exe文件。

3. 通过加载动态链接库zlibwapi.lib使用zlib

   1). 同2-1)。

   2). 同2-2)。

   3). 同2-3)。

   4). 在Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions 中增加 "_CRT_NONSTDC_NO_DEPRECATE,_CRT_SECURE_NO_DEPRECATE,ZLIB_WINAPI"。根据官方文档,1.2.5版本需要定义ZLIB_WINAPI。

   5). 同2-5)。

   6). 在Configuration Properties -> Linker -> Input -> Additional Dependencies 中增加 "zlibwapi.lib"。这个是配合动态链接库"zlibwapi.dll"静态导出库 。 

   7). 编译,生成exe文件。

4. 测试

   1). 首先测试使用静态链接库的版本。将生成的test.exe文件复制到测试文件夹中。并新建一个test.txt文档,在里面输入大量字符。

   2). 通过cmd进入此测试文件夹。输入命令test.exe test.txt

   3). 观察压缩,解压结果。

   4). 然后测试使用动态链接库的版本。将生成的test.exe文件和zlibwapi.dll文件复制到同一测试文件夹中。并新建一个test.txt文档,在里面输入大量字符。

   5). 通过cmd进入此测试文件夹。输入命令test.exe test.txt

   6). 观察压缩,解压结果。

参考文献

http://www.helyar.net/2010/compiling-zlib-lib-on-windows/

http://forum.filezilla-project.org/viewtopic.php?f=3&t=7493

http://topic.csdn.net/u/20100711/19/4a3f45e9-b743-48d1-abac-f8e6d493f330.html

http://blog.sina.com.cn/s/blog_5325b5f90100rvbl.html


64位的zlib文件(我之前没有实践,多谢某王啊)按照下面的方式。。。。

此处可参照http://www.cnblogs.com/MrOuqs/p/5751485.html

使用visual studio ide进行编译

  PS.此处有些教程包括x86编译,也会重复去执行类似到masmx64执行bld_ml64.bat的工作,然后拷贝到根目录后再打开visualstudio,其实这些也是不需要的工作,因为IDE的工作其实就是再背后悄悄的执行Makefile里面的编译链接工作,只不过不那么直观的展示给你看而已。

  1、打开E:\zlib128\zlib-1.2.8\contrib\vstudio\vc11,双击zlibvc.sln,Visual Studio 2015就会将其打开,但是这个sln是用vs2012创建的,所以会弹窗提示,需要更新相关的文件配置如图,点击确定即可

  

  2、接下来吧菜单栏中的输出平台选择位x64,右键点击zlibvc,在弹出菜单中点击build,就会开始报错如下

1
2
3
4
Severity    Code    Description Project File    Line    Suppression State
Error   MSB3073 The command "cd ..\..\contrib\masmx64
bld_ml64.bat
:VCEnd" exited with code 9009.  zlibvc  C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets  123

  这个错误的产生鞥是来自生成时间中的预生成事件,因为无法准确的通过路径找到bat文件执行

  3、解决方法如下:右键点击zlibvc,在弹出菜单中选择Properties(属性),在弹出的属性对话框选择Build Event(生成事件),点击Pre-Build Event(预先生成事件),会看到Command Line(命令行)中有错误提示所示的命令行,在这里我们对其进行修改,点击命令旁边的下拉按钮,然后点击edit(编辑),把内容删掉,替换如下:(此处的内容可参照命令行方式)

1
2
3
E:
cd E:\zlib128\zlib-1.2.8\contrib\masmx64
bld_ml64.bat

  注意此处就是执行生成inffasx64.obj和gvmat64.obj的工作,因为再IDE中没有去链接asm,就会以来预先时间执行脚本生成,看看bld_ml64.bat脚本内容就会明白,他们会在本目录下生成对应的lst文件和obj,其他的拷贝链接工作IDE会在背后完成,如下

1
2
ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
ml64.exe /Flgvmat64   /c /Zi gvmat64.asm

  添加号之后取人关闭,然后重新执行第二步进行编译,发现已经开始正常的编译了,但是后面又报了个错如下,只需要双击错误,就会自动打开一个.def文件,将Verson一行的1.2.8改为1.28,然后保存

1
2
Severity    Code    Description Project File    Line    Suppression State
Error   LNK1118 syntax error in 'VERSION' statement zlibvc  E:\zlib128\zlib-1.2.8\contrib\vstudio\vc11\zlibvc.def   4  

  重新执行第二部操作进行编译,此时就会提示成功的消息,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
1>------ Build started: Project: zlibvc, Configuration: Debug x64 ------
1>  Microsoft (R) Macro Assembler (x64) Version 14.00.24210.0
1>  Copyright (C) Microsoft Corporation.  All rights reserved.
1>
1>   Assembling: inffasx64.asm
1>   Assembling: gvmat64.asm
1>  Microsoft (R) Macro Assembler (x64) Version 14.00.24210.0
1>  Copyright (C) Microsoft Corporation.  All rights reserved.
1>
1>     Creating library x64\ZlibDllDebug\zlibwapi.lib and object x64\ZlibDllDebug\zlibwapi.exp
1>  zlibvc.vcxproj -> E:\zlib128\zlib-1.2.8\contrib\vstudio\vc11\x64\ZlibDllDebug\zlibwapi.dll
1>  zlibvc.vcxproj -> x64\ZlibDllDebug\zlibwapi.pdb (Full PDB)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

  在E:\zlib128\zlib-1.2.8\contrib\vstudio\vc11\x64\ZlibDllDebug目录下就会出现对应的输出文件,如图

  

  至此,所有的编译工作完成。

libpng    一定要下载对资源,我之前好了好多其他版本的,都不对,最后找到1.2.37版本的,就对了。这个安装过程参考http://www.360doc.com/content/13/0311/09/3972394_270725627.shtml

但是我的一直做不对,最后直接把其他工程都删去了,只留下了一个libpng,并且在LIB Debug|win32中加入zlib的静态模式属性表,最后才成功了,生成libpngd.lib,因为后面demo跑的时候需要libpng.lib,故这个时候应该把LIB Release模式也跑一遍,生成libpng.lib。(zlib只有动态和静态的区别,故加属性表的时候和LIB Debug加同一个就可以了)

将libpngd.lib和libpng.lib以及png.h   pngconf.h放到同一个文件夹中。

使用时,包含头文件: 属性-C/C++--常规--附加包含目录:上一个文件夹

包含.lib文件所在的目录:属性--连接器--常规--附加库目录

包含.lib文件: 属性--连接器--常规--附加依赖项(libpngd.lib和libpng.lib

因为它需要zlib库,故需要加上zlib库的属性表。

4.创建一个新工程,我直接使用的AR.sln,并没有新建。

5.这边需要多说一句,这个需要Google test这个库,幸亏这个库容易安装,故没有泪崩啊。。。。

参考http://blog.csdn.net/officercat/article/details/39621423

首先下载google test,http://code.google.com/p/googletest/可以下载到最新版,当然这个网站经常被屏蔽,所以可以直接到其他网站下一个源代码压缩包,现在基本上gtest-1.6版是够用的,下载下来后,放到一个合适的位置,这里面的源文件在编译器中需要被引用到。

可以看到源代码文件夹里,有适应各种操作系统的编译脚本或者工程文件,比如cmake,make,msvc, msvc文件夹里就是一个支持visual studio的solution文件


打开gtest.sln,如果有需要,visual studio会自动升级我用的是visu studio 2012),可以发现里面有几个项目,其中gtest和gtest_main的产出是对google test编写有用的。



然后编译,会发现报错

error C2977 "std::tuple" too many template arguments

解决方法就是在每隔工程(project)的属性中的C++  --> Preprocessor (预处理)--> preprocessor defination (预处理定义)中增加

_VARIADIC_MAX=10




然后编译通过,debug和release都编译一遍,把编译出的gtest.lib,gtestd.lib, gtest_main.lib, gtest_maind.lib 都放到gtest根目录的lib文件夹下(lib和include位于同一级)。

因为要用到gtest里的库,所以要增加对头文件和库的搜索路径,VC里有很多地方可以配置,我选择在项目属性--> C++-->General-->additional include Directories 里增加

$(GTEST)\include



在项目属性--> Linker-->General-->additional Library Directories 里增加



$(GTEST)\lib

在项目属性--> Linker-->Input-->additional Dependencies 里增加 gtest的lib,

如果是release设置,用gtest.lib,gtestd.lib; ruguoshidebug设置,用 gtest_main.lib, gtest_maind.lib。


故AR中需要加入gtest、Opencv、libpng、zlib这四个库的属性表,加好以后,库就配置好了。

加好库以后,会出现以下错误,!=属性不匹配,这时应该把ifs!=NULL改为!ifs,这样错误就会消失了,哈哈哈,但是不要太高兴哦,因为后面还有别的问题呢。。。。


这应该把C/C++--代码生成--运行库由多线程调试DLL改为多线程调试(MTd),这样很多问题就迎刃而解了,但是会出现一个新的小问题,


将msvcrtd.lib加入附加依赖项就可以了,是不是很完美,O(∩_∩)O哈哈哈~

但是运行的时候回提示没有opencv_core249d等一系列问题,这是因为附加依赖项中不应该有这些,因为我使用的是2.4.13版本啊,删去这些库,

生成的时候不会有错。

但是运行的时候会出现新的错误“无法定位程序输入点_glutInitWithExit 于动态链接库。。。。exe”这是因为这个工程自动调用了include里面的glut.h想要改正这个问题,将附加包含目录中的include删去就可以了,生成。。。运行。。。。就会看见摄像头成功打开了,是不是很有成就感????

为了配好这几个库,我使用了整整一天的时间,各种问题,各种解决啊,真的有一种刚翻过一座山,又来一座更大的山的感觉啊,

仅此记录一下,方便他人,方便自己。



0 0
原创粉丝点击