近期在优化老项目的执行速度,考虑到比较耗时的部分是对图像处理的部分,因此考虑利用GPU加速处理。由于历史遗留问题,OpenCV的版本是比较老的2.4.9,同时项目是基于32位编译的,因此需要编译32位的OpenCV(GPU)。这个奇怪的搭配让我找了很多资料,遇到了很多坑,这里将成功的方案记录一下。
配置如下:
名称 | 版本 | 架构 |
---|---|---|
Windows | 10 | x64 |
OpenCV | 2.4.9 | - |
CUDA | 6.5 | x64 |
Cmake | 3.0.2 | x64 |
TBB | 44 | - |
VS | 2010 | - |
同款配置下载(待添加)
一路下一步就可以,安装完成后,检查一下是否安装成功。
nvcc -V
bin目录添加环境变量
include目录添加环境变量
↓↓↓–因为要编译32位的因此选择ia32文件夹–↓↓↓
lib/ia32/vc10目录添加环境变量
↑↑↑–因为项目是vs2010因此选择vc10–↑↑↑
选择合适的路径解压
4.1配置OpenCV源码目录
4.2配置编译后输出目录
4.3勾选Advanced
4.4点击Configure(重要)
选择Visual Studio 10 2010编译为32位
4.5配置信息
取消勾选
‘BUILD_DOCS’
‘BUILD_EXAMPLES
‘CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE’
勾选
‘WITH_CUBLAS’
‘WITH_CUDA’
‘WITH_OPENGL’
‘WITH_TBB’
点击Configure
4.6TBB目录(可能出现)
如果TBB目录还是红色,需要手动添加
名称 | 路径 |
---|---|
TBB_LIB_DIR | …/lib/ia32/vc10 |
TBB_STDDEF_PATH | …/include/tbb/tbb_stddef.h |
点击Configure
4.7当不出现红色项的时候就说明配置没问题了
点击Generate等待完成
5.1生成前准备
打开‘opencv-2.4.9\modules\gpu\src\nvidia\core\NCV.cu’加上 #include ,否则生成时会有错误
5.2编译 OpenCV.sln
5.2.1生成opencv_core
5.2.2生成opencv_gpu
5.2.3生成ALL_BUILD
5.2.4生成INSTALL
全部完成后就会在上边选择编译后输出文件夹内生成install文件夹,这就是以及被编译好的32位的OpenCV(GPU)
6.1可执行文件目录:
6.1.1TBB
…/tbb44_20150424oss/bin/ia32/vc10
6.1.2CUDA
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin
6.2包含目录:
6.2.1OpenCV(GPU)_include
…/install/include;
6.2.2OpenCV(GPU)_include_opencv
…/install/include/opencv;
6.2.3OpenCV(GPU)_include_opencv2
…/install/include/opencv2;
6.3库目录:
6.3.1OpenCV(GPU)_lib
…/install\x86/vc10/lib
int num_device = gpu::getCudaEnabledDeviceCount();
if(num_device > 0)
{
cout<< "GPU可用" << endl;
}
else
{
cout<< "GPU不可用" << endl;
}
将项目配置完成后,迁移到装有CUDA10.1的设备上,发现缺少CUDA6.5的dll,直接将少的考过来放在exe文件同目录,竟然能运行!并且在执行过程中成功使用了GPU,意外收获,意外收获!
但是版本不一致会增加运算时间,还是建议使用对应版本!
9.1为什么选择CUDA6.5而不是最新版本
①CUDA9以后不在兼容OpenCV2.X。
②测试过CUDA7.5在生成的时候报错**CMake Error: The following variables are used in this project, but they are set to NOTFOUND.**该问题是因为CUDA提供的某些DLL只有x64的,因此在选择编译x86的时候就报错。
③测试过CUDA5/5.5,驱动在Win10上一直安装不上。
9.2为什么是32位
因为历史遗留问题,项目整体调整为64位难度比较大。
参考文章:
OPENCV2.4.9+CUDA6.5+VS2013 64位系统环境搭