为了试试GPU能不能使数字识别的纯算法代码加速,而去配置了OpenCV+CUDA的环境。作为一个小白,配置过程中遇到了不少报错,从暴躁,到无奈,到葛优瘫式认命望天。感谢前人分享的经验,在他们的基础上,我也想把自己的配置过程、遇到的问题和原因猜测分享给大家。同时,欢迎大家进行补充,如果有不正确的地方,也请多指教。
前提环境:
Win10
VS2019
OpenCV3.4.1
CUDA10.2
CMake 3.17.0
下面进入配置过程的分享,我把核心步骤的字体都加粗了——如果赶时间的话,可以只看大标题和加粗部分。
说是安装,其实就是下载TBB库压缩包并解压
在系统环境变量中加入:
tbb2019_20190605oss_win\tbb2019_20190605oss\bin\intel64\vc14
暂时不明白为什么一定要装TBB,有些经验分享上说TBB是用于编译OpenCV core的。
我进行过以下3种尝试:
1、不安装TBB,直接进行OpenCV+CUDA的CMake编译。
结局:能够成功CMake编译,但是在VS install生成时失败。
2、安装2020年更新的TBB库
结局:CMake在生成过程中报错。猜测原因可能是因为TBB版本太新,3.17.0版本的CMake没来得及兼容?
3、安装2019版本TBB(tbb2019_20190605oss_win )
结局:成功编译。
综上所述,推荐大家安装比CMake老半年以上的TBB库。(比如如果CMake是2020年1月更新的版本,那就安装2019年6月以前更新的TBB库)。
打开cmake-gui.exe(在bin文件夹中):
在“Where is the source code”处输入OpenCV sources文件夹的路径(…\opencv3.4.1\opencv\sources),
在“Where to build the binaries”处输入用于存放cmake编译后文件的路径,
勾选“Grouped”和“Advanced”:
因为我的opencv库文件夹的路径中有中文,我担心cmake时可能会出错,所以就把sources文件夹复制到了全英文路径中。
猜测下面这个报错是因为那次cmake编译时,source code路径带有中文:
点击左下角的“Configure”:
等待10分钟左右,会出现一片红,红色的是未更新的配置:
在默认勾选的基础上,增加“with CUDA”、“with TBB”的勾选,然后再次点击"Configure"进行更新:
更新后,会显示TBB对应路径"NOTFOUND",我们需要自行输入TBB对应路径:
TBB_ENV_INCLUDE:
…/tbb2019_20190605oss_win/tbb2019_20190605oss/include
TBB_ENV_LIB:
…/tbb2019_20190605oss_win/tbb2019_20190605oss/lib/intel64/vc14/tbb.lib
TBB_ENV_LIB_DEBUG:
…/tbb2019_20190605oss_win/tbb2019_20190605oss/lib/intel64/vc14/tbb_debug.lib
然后点击"Configure",会自动匹配TBB_VER_FILE的路径:
…/tbb2019_20190605oss_win/tbb2019_20190605oss/include/tbb/tbb_stddef.h
再次点击"Configure".
等到没有红色,并显示"Configuring done"时,就可以点击"Generate"。
等到显示“Generating done”后,就可以关闭CMake窗口了。
在自定义生成路径下打开OpenCV.sln:
(可以跳过的步骤)根据前人经验,可以先尝试生成modules下的opencv_core,如果报错了,就说明CMake编译有问题,得重头再来。这样可以减少在漫长等待之后迎来一堆报错的概率,节约试错时间:
在CMakeTargets下选中INSTALL,右键“生成”:
生成过程可能需要等待3-5个小时。如果有360杀毒的话,建议暂时关掉——不然在生成后期,它老跳出来“关键位置篡改”的提醒。
在系统环境变量中加入:
…\CUDACV341TBB(CMake编译的自定义生成路径)\install\bin
新建一个sln项目,点击菜单栏中的"项目-属性",出现:
在"配置属性 - VC++目录 - 包含目录"中加入:
…\CUDACV341TBB\install\include
在"VC++目录 - 库目录"中加入:
…\CUDACV341TBB\install\lib
在"链接器 - 输入 - 附加依赖项"中加入…\CUDACV341TBB\install\lib路径下的一大串.lib文件名。
一个个复制文件名很耗时间,我们可以进入lib文件夹,新建一个txt文件,输入:
DIR ./B>LIST.TXT
保存后,将文件名后缀从.txt改为.bat:
双击这个.bat文件后,lib文件夹下会出现一个"LIST.TXT"的文本文档:
然后我们就可以把里面的.lib文件名复制出来,粘贴到"链接器 - 输入 - 附加依赖项"中。
配置完成后,将OpenCV自带例子gpu-basics-similarity.cpp的内容复制进去。
(例子具体路径:\opencv3.4.1\opencv\sources\samples\cpp\tutorial_code\gpu\gpu-basics-similarity)
生成项目后,在.exe文件所在目录中,存入2张分别名为"1.jpg"、"2.jpg"的图片。
打开command,进入.exe文件所在目录,输入命令:
GPUnum.exe 1.jpg 2.jpg 10
(即:“.exe的文件名+空格+图片1的文件名+空格+图片2的文件名+空格+10”)
如下图一样显示结果,说明成功:
祝大家都能一次配置成功!
参考文献:
Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013
Win10下Cmake编译配置Opencv3.4+Cuda8.0+vs2013