注:新版本的OpenCV(3.0及以后)很多设计都跟本文撰写时不同了,不能保证本文内容还适用于新版本
openCV是一个功能强大的开源计算机图形库,在计算机视觉领域有着广泛的应用。本文以openCV2.4.9为例(但不限于2.4.9),介绍Windows下openCV库的安装与编译。
如果你只是想进行简单的opencv配置,可以先试试这个小工具(下载地址)
支持版本:Visual Studio2008及以上版本,openCV2.3.1及以上版本。
软件要求:.net framework 3.5,其实装了VS2008以上就行了。
使用方法:下载openCV后解压得到opencv文件夹,把小工具放到build文件夹外,选择好安装路径,点击配置就行了。程序会自动检测系统内openCV支持的版本最高的VS并进行配置(也可以手动选择),并且自动生成属性表(属性表使用方法参照下文)。
一般来说,我们要调用某个使用C\C++编写的库,需要三步:
第一步,在编写代码的时候包含该库的头文件。
第二步,在编译程序的时候引用相应的库文件。
第三步,在程序运行的时候调用相应的DLL文件。
1. 解压文件
打开下载的OpenCV-2.4.9.exe,选择一个目录临时存放解压后的文件,这里我把它放在 D:\下。
解压完成后即可在解压目录下看到D:\opencv文件夹,内含sources跟build两个文件夹。
sources文件夹内包含openCV的所有源代码、帮助文档以及样例代码等。
而build文件夹内就是头文件、已经编译好的库文件以及DLL文件。
2. 获取头文件
打开build文件夹,可以看到里面包含了include、x86、x64、java和Python等文件夹。
include文件夹内就是openCV的头文件,把它拷贝到目标文件夹内。
3. 获取库文件和DLL文件
库文件需要根据自己使用的编译器来选定。
x86和x64文件夹内包含的就是openCV的库文件和DLL文件。
x86下对应的是32位VC++编译器,x64对应的则是64位的。
VS中默认的VC++编译器是32位的,所以这里选择x86。
打开x86文件夹,可以看到vc10、vc11、vc12代表VC++编译器的版本,vc10是指VS2010,vc11指VS2012,vc12指VS2013。事实上除了这里选择的文件夹不同以外,三个版本的VS下openCV的配置是完全一样的。所以本文同时适用于VS2010、VS2012以及VS2013。
bin文件夹内包含了openCV的DLL文件。
lib文件夹中包含的是动态库文件,而staticlib文件夹中则是静态库文件。
我们使用动态库文件,所以把bin和lib文件夹拷贝到目标文件夹中。
这样,openCV的安装就完成了。
把openCV的DLL文件目录加入环境变量。这样做的目的是程序运行时可以找到需要调用的openCV的DLL文件,避免出现“系统中缺少opencv_XXX.dll”这样的错误。
右键点击桌面上的“计算机”->属性->高级系统设置->环境变量,这里有用户变量和系统变量,两个都可以。找到Path变量,双击打开,在变量值一栏开头加入以下路径:C:\opencv\bin;
记得后面要有英文的分号和其它环境变量隔开。
如果前面使用了静态库,这一步可以跳过。
打开Visual Studio,随便建立一个空项目,在属性管理器中右键“Debug | Win32”->添加新项目属性表
修改项目属性表的名字,名字改成什么没有限制,自己认得就好
点击“添加”后,即可在属性管理器中见到我们新建的属性表
2. 配置属性表
右键点击我们刚建立的属性表然后点击“属性”,或者直接双击。
在弹出的属性页中点击“VC++目录”,点击右侧的“包含目录”,添加包含openCV头文件的目录。之前我们把include文件夹放在了C:\opencv下,所以这里是C:\opencv\include
同理,修改“库目录”,添加C:\opencv\lib
然后打开属性页下的“链接器”->“输入”->“附加依赖项”,按照使用的功能模块添加相应的lib文件。比如,要使用openCV的图像处理模块,就在这里添加opencv_imgproc249d.lib。
需要注意的是,这里配置的是Debug版的属性表,所以添加的lib文件名字都是以字母d结尾的,同名但是名字不以字母d结尾的库文件是release版的。
如果你在代码中用到了某个模块的变量、函数等,但却没有在这里添加相应的库文件,或者添加的库文件版本与当前使用的编译器不符,就会出现“无法解析的外部符号”这样的错误。
为了避免每次使用不同的模块都要添加一次,这里也可以一次性把所有的库文件都添加进去。
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_ml249d.lib
opencv_nonfree249d.lib
opencv_objdetect249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_videostab249d.lib
这里需要注意,如果使用的openCV版本不是2.4.9,库文件后面的249就需要换成其它版本号,比如openCV2.3.1的就需要改成opencv_highgui231d.lib,不要直接复制上面的内容。
同样地,我们也需要往“Release | Win32”添加新的属性表openCV Release,并配置相应的包含目录,库目录和附加依赖项。其中包含目录跟库目录的配置跟debug版是一样的,附加依赖项的配置,要添加的是相应的Release版库文件。
3. 属性表的使用
配置完成后,在“解决方案浏览器”里右键点击项目名称->“在资源管理器中打开”,可以看到文件夹内有两个属性表文件“openCV Debug.props”和“openCV Release.props”。里面就保存了我们之前进行的配置(包括包含目录、库目录和附加依赖项),将它们拷到目标文件夹中,方便以后调用。
之后再有要用到openCV的项目时就不需要重新配置项目属性,只要把这两个属性表添加到属性管理器中即可。不仅仅是openCV,其它外部库的调用也推荐通过属性表的方式进行。
VS2008及以下版本也可以通过全局配置的方式使openCV配置对多个项目生效,但这种做法并不推荐,这也是为什么微软从VS2010开始就把全局配置取消掉的原因。
下面用个小程序测试一下openCV是否添加成功。
#include
//引入openCV的highgui模块,附加依赖项里也要添加opencv_highgui249.lib
//使用#include 虽然更简单,但不推荐这样做
int main()
{
IplImage *img;
img = cvLoadImage("D:/opencv/sources/samples/cpp/lena.jpg");
if (img)
{
cvNamedWindow("pic", CV_WINDOW_AUTOSIZE);
cvShowImage("pic", img);
cvWaitKey(0);
}
return 0;
}
代码的作用是加载opencv\sources\samples\cpp目录下一张文件名为lena.jpg的图片并显示出来,你也可以把图片换成自己的,效果如下图所示。
配置完成后,D盘下解压出来的opencv目录就可以删除了。
直接在官网下载的openCV已经自带了编译好的库文件和DLL文件,一般使用是不需要编译openCV的。但也有可能出现openCV预编译的库文件没有适合自己使用的VS版本的,比如openCV2.4.9就没有自带适用于VS2008的库文件,又或者需要对openCV的模块进行修改的情况。这时就需要对openCV进行重新编译。
除了openCV源代码外,我们还需要准备以下文件:
TBB(下载地址)
TBB(全称Threading Building Blocks)是由 Intel针对多核平台开发的一个开源的C++的模板库,添加该库对openCV的多核性能有一定的提升,不使用也不影响openCV的正常编译。
这里需要下载的是Window *OS版,下载后文件名应该类似于tbb42_20140122oss_win.zip,里面就包含了TBB的头文件、编译好的库文件和DLL文件。
我们把它临时解压到D盘下,得到D:\tbb42_20140122oss文件夹。
CMake(下载地址)
要使用VS编译openCV的源代码,就需要利用CMake把openCV源代码组织成VS可以识别的“解决方案”。所以CMake在openCV编译里是必不可少的。它的安装很简单,一路下一步即可。
打开CMake,点击“Browse Source”,选择openCV的源代码所在目录,我们之前解压到了D:/opencv/source。
点击Browse Build”选择之前新建的临时文件夹。
需要注意的是,CMake中路径包含的都是左斜杠而不是Windows中常见的右斜杠。
点击Configure,在弹出的页面选择自己使用的编译器,这里选择Visual Studio 2010,点击Finish。
可以看到界面中央多了很多编译参数设置。
将滚动条拖到最下面,这里集中了最常用的参数设置。包括设置CUDA支持,Qt支持,TBB和IPP支持等,把“WITH_TBB”勾选上,表示添加TBB支持。如果你有购买并安装了Intel的IPP库,这里也可以把"WITH_IPP"勾选上,可以进一步提升openCV的性能(新的openCV3.0已经自带了IPP库)。
再点击Configure,稍等片刻。会有一项显示为红色,Value显示没有找到TBB的包含目录。
将它的Value改为D:/tbb42_20140122oss/include。然后点击Configure,完成后会有两项变成红色,再次点击Configure,就没有红色的条目了。
点击Generate生成解决方案。
用VS打开临时文件夹下的openCV.sln文件。在“解决方案管理器”中展开CMakeTargets,右键点击INSTALL,选择“构建(Build)”,耐心等待编译完成。
完成后,再把编译选项从Debug改成Release,再次右键点击INSTALL,选择“构建”。
打开临时文件夹下的install文件夹,里面已经包含了openCV头文件和编译完成的库文件以及DLL文件。
把install\x86\vc10下的bin和lib文件剪切到install文件夹内。
打开D:\tbb42_20140122oss\bin\ia32\vc10,将文件tbb.dll和tbb_debug.dll拷贝到install\bin里。然后就可以把D:\tbb42_20140122oss文件夹删掉了。
这样install文件夹就相当于上面配置openCV的目标文件夹。使用方法跟之前提到的预编译的openCV文件是一样的。
将install文件夹拷贝到其他地方保存,build文件夹就没多大用处了, 可以删掉节约空间。