主要参考浅墨_毛星云文章:http://blog.youkuaiyun.com/poem_qianmo/article/details/19809337
我之前就是参考上面这篇文章来配置环境,然而还是遇到很多的问题,爬过很多坑之后,我决定专门写一篇文章,总结VS下面配置OpenCV的方法,并针对浅墨的文章作详细的补充.废话不多说,开始正文。
VS下配置OpenCV 主要步骤:
1. 配置环境变量
我们需要配置 系统变量 下面的 Path。本文不再赘述Windows下面配置环境变量的方法,如需帮助,可以参考浅墨的那篇文章,写得相当详细。
好了,关键点来了。浅墨的参考文章中说:
对于32位系统,添加 “…… opencv\build\x86\vc10\bin”;
对于64位系统,添加“…… opencv\build\x86\vc10\bin”和”…… opencv\build\x64\vc10\bin”
这里有两个问题:如何选择 x86 或者 x64 ? VS2010/2012/2013/2015如何选择VC10/11/12 ?
关于 x86 / x64 , 这个取决于你的项目属性:( 菜单栏:项目->属性 )
如图所示,如果是32位,则选择 x86 ; 如果是 64位,则选择 x64。
关于 VC10/11/12的问题,版本对应如下:
如果是 VS2010 , 则选择 VC10;
如果是VS2012,则选择VC11 ;
如果是VS2013,则选择VC12
对于其他版本的VS,我没有试过,也就不能说什么了。
值得注意的是,VC10\11\12 最好只添加其中的一个,如果同时包含两个或更多,就可能出现各式各样稀奇古怪的bug。有兴趣的可以看文章最后的 bug 列表。
2. 配置 项目属性-VC++ 目录
在 VC++目录-包含目录 中 添加如图所示的 3 个目录。然后在 库目录 中添加:
跟环境变量一样,这里要选择 x86 / x64 , VC10/11/12。
3. 配置 项目属性-链接器-输入
这个地方最最重要的就是区分 Debug / Release :
注意看红色圈出的部分,如果是 Debug , 则添加:(注意OpenCV版本,我使用的2.4.11。可以根据自己的版本进行修改,如果是 2.4.8 , 把 每一行的2411改成248 就行)
opencv_ml2411d.lib
opencv_calib3d2411d.lib
opencv_contrib2411d.lib
opencv_core2411d.lib
opencv_features2d2411d.lib
opencv_flann2411d.lib
opencv_gpu2411d.lib
opencv_highgui2411d.lib
opencv_imgproc2411d.lib
opencv_legacy2411d.lib
opencv_objdetect2411d.lib
opencv_ts2411d.lib
opencv_video2411d.lib
opencv_nonfree2411d.lib
opencv_ocl2411d.lib
opencv_photo2411d.lib
opencv_stitching2411d.lib
opencv_superres2411d.lib
opencv_videostab2411d.lib
如果是 Release , 则添加:
opencv_ml2411.lib
opencv_calib3d2411.lib
opencv_contrib2411.lib
opencv_core2411.lib
opencv_features2d2411.lib
opencv_flann2411.lib
opencv_gpu2411.lib
opencv_highgui2411.lib
opencv_imgproc2411.lib
opencv_legacy2411.lib
opencv_objdetect2411.lib
opencv_ts2411.lib
opencv_video2411.lib
opencv_nonfree2411.lib
opencv_ocl2411.lib
opencv_photo2411.lib
opencv_stitching2411.lib
opencv_superres2411.lib
opencv_videostab2411.lib
浅墨的文章中把 debug 和 release 版本统统添加,然而这有可能引起许多稀奇古怪的 bug 。详情可以看文章最后的 bug 列表。
4. 配置 C++ 属性
请注意,前面的三个步骤是关键步骤,这个步骤是可选步骤,也就是说,如果你按照前面三个步骤做,但是还是有 bug , 这时可以参考这个步骤。
检查运行库,最好是 "多线程调试DLL"
以上就是 VS2013 配置 OpenCV2.4.11 的主要步骤了。然而,事实上,bug 总比 solution 多,下面是我所收集的 Bugs .
(1). vs2013 opencv MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 __imp__EncodePointer@4,该符号在函数 _pre_........
28个无法解析的错误。
一开始我以为是OpenCV的配置有问题,反复对比参考的文章,没有发现错误,确认不是openCV的问题。
百度搜索 “无法解析的外部符号 __imp__EncodePointer@4” , 发现是 kernel32.lib 的问题:
明明就有kernel32.lib , 还是有问题。算了,还是手动添加一下更加保险:
VC++目录-库目录:添加“ C:\Program Files %28x86%29\Microsoft SDKs\Windows\v7.0A\Lib ”
链接器-输入:添加 kernel32.lib
bug 解决!
(2) .\..\..\..\..\Downloads\test.jpg : fatal error LNK1107: 文件无效或损坏
错误原因:文件目录写得不正确。
例如:
项目名称: Hello-OpenCV
读取图片: Mat image = imread( "test.jpg" );
则将 test.jpg 放置到项目根目录下面的与项目同名的文件夹下面,如:
如果采用绝对路径,那么要注意双斜杠转义的问题,如 Mat image = imread( "C:\\Users\\kitty\\test.jpg" );
(3)读取位置 0x xxxx时发生访问冲突
中断-调试,出现下面的界面:
这里就引出了一个非常常见的问题: 没有为 opencv_highgui2411d.dll 加载符号。
这个符号文件叫做 opencv_highgui2411d.pdb , 用来调试 OpenCV。如果你不是自己编译OpenCV源代码然后安装OpenCV,就没有这些 pdb 符号文件。如果你的确想深入地调试 OpenCV 函数,例如 imread(),可以自行编译 OpenCV源代码,得到 pdb 文件。但是,针对这个 bug 而言,不需要这么做!之所以出现这个 bug , 跟 OpenCV 本身没关系,也就是说, OpenCV的代码没有错误,你不用深入到 OpenCV源代码去发现 imread() 的问题,这个bug 的原因在于前面说的 4 个配置步骤 。 所以,请回到本文开始的部分,再仔细地核对每一个步骤,特别是需要注意的地方,比如 debug / release 的 lib 混用,Path 变量中是否同时包含了 VC10/11/12 中的两个版本或三个版本。这些才是出现 bug 的根本原因 。
(4)Microsoft exception : cv:: Exception at memory location :0xxxxxx
这个 bug 跟 ( 3 ) 差不多,参考(3)
(5)OpenCV Error: Null Pointer (NULL or empty buffer) in cvOpenFileStorage,file ..\..\..\..\opencv\mudules\core\src\persistence.cpp, line 2696
貌似是 persistence.cpp的 2696 行出现错误了,查看 persistence.cpp 的源代码,发现是空指针异常。但是我的代码中对应的位置的的确确不是空指针,于是问题不在于 OpenCV的代码,也不在于自己的源代码,还是配置的问题。参考(3)
最后总结:
(1)如果出现了奇怪的 bug , 如果确定自己的代码没有写错,那么不要犹豫了,回去看看 VS+OpenCV的配置步骤吧,问题的原因就是没有配置正确 。在配置环境的时候,多一点细心,多花一点时间,就可以避免非常多稀奇古怪的 bug !
(2)bug 总比 solution 多,遇到了也不要急。解决 bug 是一门艺术,慢慢积累经验,有自己的心得,就会成为 debugger 高手!