折腾了三天终于配置成功了,在此写下编译配置的全部步骤和遇到的很多坑。
整体介绍:
OpenCV 中 CUDA 实现的函数还不是太多,使用前要在OpenCV的官网上确认以下你想要的功能是否已经实现,否则费了老鼻子劲配个环境不能用,太浪费时间了。
编译的时候要编译Release 和Debug 两个版本,我的电脑 i5-4460 3.20GHz ,每个版本大概需要两个半小时左右,电脑配置不一样时间也会有些不同。编译完成之后整个文件夹19.7G(MD,这么大,吓死宝宝了~)。
环境:
Windows10 专业版 64位
Virtual Stadio 2013
Opencv 3.1
Cuda 7.5
Cmake 3.4.3
安装步骤:
0、安装前准备的内容:
安装TBB:
自行去官网下载,下载后的文件,解压放在C:Program Files(可以放在任意目录,是后边环境变量设置的时候对应调整一下即可),目录下:
然后设置环境变量:在系统-> 高级系统设置->环境变量->path 后边加入下边地址:
C:Program Files bb44_20160413ossinintel64vc12 (这里注意选择对应的32位 或者64 位和对应的VS版本,Virtual Studio2010 对应vc10, Virtual Studio 2011 对应vc11, Virtual Studio 2013 对应 vc12. Virtual Studio 2015 对应 vc14).
安装CUDA:
自行去官网下载,然后按照默认的安装就行,路径最好不要动,省得配置的时候再有麻烦。
(开始编译之前之前建议先阅读一下写在后边的我编译过程中遇到的几个大坑的问题,可能会让你少走很多弯路)
1、新建一个文件夹,并把下好的Openv3.1 和 contrib 的源码都放进去(源码在github上自行下载,地址在opencv.org上找)。
2、打开Cmake(自行下载,一定要用3.4.3的,不要用最新的),设置源码路径和目标路径(我的目标路径是:D:opencv310_CUDA),点击Configure。
PS:第一次Configure的时候由于需要下载一些文件,可能时间会久一点。
这时会让你选择环境,对应选择就可以。我的是VS 2013,所以选了上边的配置。然后点击 Finish。
说明:Cmake中红色的部分说明还没有更新,需要点击Configure更新,每次更改完一些配置或者参数之后都要点击Configure更新一下。最后确定配置无误了再点Generate,将会在你的目标文件夹中生成项目文件。
3、这里Cmake里边需要先配置点东西:
把下边的
WITH_TBB
WITH_CUDA
都勾选上,其他的项可以暂时不管。
PS:这里边有一个BUILD_opencv_world的选项,网上有人建议不要选,我就没有选,说是会出问题的几率比较大,而且选了这个选项之后,所有的文件都会被编译到一个dll里边去,大家还记得,在OpenCV官网上下的直接可以在Windows上可以用的OpenCV么,那个里边就是一个opencv_world310.dll,把所有的类、函数什么的都放到这个里边去了,这样的坏处就是,很多你的程序中用不上的东西也都给你放进去了。
然后点Configure
这时,会让你选择TBB的路径,对应填写好就行,我的是:C:Program Files bb44_20160413ossinclude
然后再次Configure, 如下图:
这次又会有关于TBB的两个红色的,这个是Cmake已经自己找到的路径,你看一眼,没什么问题就再一次Configure。
这次就不会有红色的了,确认一下没什么需要再配置的了,就直接Generate。
等着Generate完成,你就可以去目标文件夹去看生成的结果了。
4、在你的目标文件中找到OpenCV.sln 文件,并用VS打开:
我的目标文件夹是D:opencv310_CUDA
5、打开之后,大概长这样
然后在,CMakeTargets下的INSTALL上右键->生成。(生成之前建议先阅读一下写在后边的我编过程中遇到的几个大坑的问题,可能会让你少走很多弯路)
然后就慢慢的等待吧,等着编译完成就OK了。
6、编译完成之后,你会在你的目标文件夹中找到一个install文件夹,里边就有Debug和Release的各种你需要的东西。
install文件夹大概长这样:
是不是有一种很亲切的感觉。
然后就是配置环境变量,配置VS还有用程序测试了。这个写在最后,继续往下翻。
-------------------------------------------------------
先说几个大坑,要特别注意,不然会浪费掉很多时间:
-------------------------------------------------------
1、要特别注意,Cmake的版本不要用最新的3.5,一定要用3.4.3,不然会出现很多问题,比如说:
无法打开输入文件“....libReleaseopencv_bioinspired310.lib”
之类的错误。
刚开始最头疼的就是OpenCV的 bioinspired(和医学,生物图像处理相关的一些功能) 这个库编译不出来,想着反正这个库也不用上,就在Cmake的时候不选他,但是如果不选,就会出现其他的一些文件找不到之类的问题。最后换了Cmake3.4.3之后一切正常。估计是Opencv或者是CUDA没有针对最新的Cmake修改。
2、Cmake完成之后,不要全部编译,这样如果到后边出问题了,前边编译了很长时间就浪费了。编译之前先选几个比较容易出问题的项目编译一下试试,比如:opencv_core, opencv_bioinspired, opencv_cudaarithm, opencv_cudabgsegm.尤其是opencv_cudaarithm, opencv_cudabgsegm这两个项目,编译起来非常慢而且最容易出问题。编译方法,在项目上 右键->生成。
3、如果全部编译完毕之后,如果有一两个项目没有编译成功,没必要再全部重新编译,直接在Cmake编译的目录里的modules目录里找到失败的类,进去用VS打开是项目,重新编译一下即可。
比如,我的opencv_cudabgsegm 项目最后编译失败,我就在D:opencv310_CUDAmodules 下找到 cudabgsegm,进入目录双击 INSTALL.vcxproj ,用VS打开项目。然后生成一次(如下图,在CmakeTargets下的INSTALL上右键->生成),就可以在install文件夹里找到之前失败的lib文件了。
配置编译好的OpenCV:
1、配置环境变量:
在Path中添加: D:opencv310_CUDAinstallx64vc12in;
(其实我在用户的环境变量中也加了一条,不过貌似加不加都行)
配置完环境变量,重启或注销才能生效
2、配置VS的项目属性:
新建一个控制台应用程序,然后在项目名称上右键->属性:
然后:
(路径以你的电脑实际为准)
(注意配置平台信息32位 还是64位,还有Release和Debug)
VC++目录 下的:
包含目录 添加以下内容:
D:opencv310_CUDAinstallinclude
D:opencv310_CUDAinstallincludeopencv
D:opencv310_CUDAinstallincludeopencv2
库目录 添加以下内容:
D:opencv310_CUDAinstalluildx64vc12lib
在链接器 下的:
输入->附加依赖项 添加(注意发布版本不一样,Debug版的带“d”, Release版的不带):
(Release版)
opencv_aruco310.lib
opencv_bgsegm310.lib
opencv_bioinspired310.lib
opencv_calib3d310.lib
opencv_ccalib310.lib
opencv_core310.lib
opencv_cudaarithm310.lib
opencv_cudabgsegm310.lib
opencv_cudacodec310.lib
opencv_cudafeatures2d310.lib
opencv_cudafilters310.lib
opencv_cudaimgproc310.lib
opencv_cudalegacy310.lib
opencv_cudaobjdetect310.lib
opencv_cudaoptflow310.lib
opencv_cudastereo310.lib
opencv_cudawarping310.lib
opencv_cudev310.lib
opencv_datasets310.lib
opencv_dnn310.lib
opencv_dpm310.lib
opencv_face310.lib
opencv_features2d310.lib
opencv_flann310.lib
opencv_fuzzy310.lib
opencv_highgui310.lib
opencv_imgcodecs310.lib
opencv_imgproc310.lib
opencv_line_descriptor310.lib
opencv_ml310.lib
opencv_objdetect310.lib
opencv_optflow310.lib
opencv_photo310.lib
opencv_plot310.lib
opencv_reg310.lib
opencv_rgbd310.lib
opencv_saliency310.lib
opencv_shape310.lib
opencv_stereo310.lib
opencv_stitching310.lib
opencv_structured_light310.lib
opencv_superres310.lib
opencv_surface_matching310.lib
opencv_text310.lib
opencv_tracking310.lib
opencv_ts310.lib
opencv_video310.lib
opencv_videoio310.lib
opencv_videostab310.lib
opencv_xfeatures2d310.lib
opencv_ximgproc310.lib
opencv_xobjdetect310.lib
opencv_xphoto310.lib
(Debug 版)
opencv_aruco310d.lib
opencv_bgsegm310d.lib
opencv_bioinspired310d.lib
opencv_calib3d310d.lib
opencv_ccalib310d.lib
opencv_core310d.lib
opencv_cudaarithm310d.lib
opencv_cudabgsegm310d.lib
opencv_cudacodec310d.lib
opencv_cudafeatures2d310d.lib
opencv_cudafilters310d.lib
opencv_cudaimgproc310d.lib
opencv_cudalegacy310d.lib
opencv_cudaobjdetect310d.lib
opencv_cudaoptflow310d.lib
opencv_cudastereo310d.lib
opencv_cudawarping310d.lib
opencv_cudev310d.lib
opencv_datasets310d.lib
opencv_dnn310d.lib
opencv_dpm310d.lib
opencv_face310d.lib
opencv_features2d310d.lib
opencv_flann310d.lib
opencv_fuzzy310d.lib
opencv_highgui310d.lib
opencv_imgcodecs310d.lib
opencv_imgproc310d.lib
opencv_line_descriptor310d.lib
opencv_ml310d.lib
opencv_objdetect310d.lib
opencv_optflow310d.lib
opencv_photo310d.lib
opencv_plot310d.lib
opencv_reg310d.lib
opencv_rgbd310d.lib
opencv_saliency310d.lib
opencv_shape310d.lib
opencv_stereo310d.lib
opencv_stitching310d.lib
opencv_structured_light310d.lib
opencv_superres310d.lib
opencv_surface_matching310d.lib
opencv_text310d.lib
opencv_tracking310d.lib
opencv_ts310d.lib
opencv_video310d.lib
opencv_videoio310d.lib
opencv_videostab310d.lib
opencv_xfeatures2d310d.lib
opencv_ximgproc310d.lib
opencv_xobjdetect310d.lib
opencv_xphoto310d.lib
PS:这些文件是我用python写的脚本生成出来的,不要一个一个从lib文件夹里把名字里拷出来,容易出错,而且工作量挺大。一共106个,各53个。
测试:
把opencv源码中的例子拿出来测试:
代码在: opencv-mastersamplescpp utorial_codegpugpu-basics-similaritygpu-basics-similarity.cpp
把代码拷到刚才建的那个VS项目里,然后生成。
注意:这里不能直接运行,这个程序要接受参数才能运行。
打开command终端, 进入编译出来的文件存放的目录,再拷两张图片到这个路径,然后用一下命令运行:
OpenCV_CUDAtest.exe left.jpg right.jpg 10
TMD这个结果显示,我的CUDA的计算速度比CPU的还慢,好像有点坑爹啊。
写在最后:据我了解,CUDA并不是一定就会比纯CUP快的,GUP更擅长处理大规模的并行计算,不擅长逻辑运算,而且在OpenCV中,要想用GPU处理,就必须先把数据转换成GPU可以处理的数据类型,然后再传输到GPU中处理,其中数据传输只能通过系统总线,速度会很慢。因此在选择CUDA的时候要慎重考虑,并不是所有的程序都适合CUDA的,说不定有的程序用了CUDA反而更慢了。估计也就是这个原因,网上Opencv + CUDA的资料才会比较少吧。
要详细了解CUDA原理以及优劣势,请自己查找更详细的资料。
Reference:
http://www.nmtree.net/2014/03/19/windows_build-opencv-with-cmake-and-vs2013.html
http://blog.csdn.net/xizero00/article/details/50823020
blog.csdn.net/kelvin_yan/article/details/48708227
http://www.cnblogs.com/freedomshe/archive/2013/01/11/win7_vs2012_opencv_rebuild.html
http://blog.csdn.net/Kelvin_Yan/article/details/38866795