写在前面
由于实验室项目的需要,需要用到OpenCV的GPU库,所以上论坛转了一圈,捣鼓了三五天,经过无数个坑,终于搭建好了这个环境,说实话都有点小佩服自己。
环境搭建的实质就是用Cmake结合Intel的tbb库外加CUDA把OpenCV的源码(sources目录下的代码)在VS上给重新编译一遍,生成能够在编写CUDA代码时候能够调用的头文件库文件。
1.环境搭建的材料
CUDA6.5
VS2010
OpenCV2.4.9
Cmake3.9.1
tbb4,3
注释:具体的版本可以有差别,只不过需要注意下载的最好都是x64或者x86的,免得出现不兼容的麻烦。
2.搭建过程
2.1 默认你已经安装了CUDA6.5+VS2010的环境,如果没有可以参看我之前的一篇。
其实也没啥,就是有点耗时间。
2.2 安装OpenCV和Cmake以及tbb4.3
其中OpenCV是解压安装,记得解压到容易找到的地方就行了。
tbb4.3也是一步一步安装了就好,完了把bin路径添加到环境变量path里就行。
我的是D:\Program Files\tbb43\bin
Cmake在安装的时候记得勾选add cmake to the system path for all users选项。
完了会在开始菜单里出现一个GUI。
2.3 打开Cmake的GUI。
在“where is the source code”下指定OpenCV的源码所在路径,在“where to build”下是将来的存放路径(VS2010是自己建的)。勾选Advanced,之后点击Configure.
2.4 点击configure,之后会出现平台选择,我的是选择Visual Studio 2010 win64,点击finish.
2.5 出现的一片红色中,勾选BUILD_EXAMPLES, WITH_CUDA, WITH_TBB, WITH_CUBLAS, WITH_OPENGL剩下的就不要动了。还有人提到,为了加快编译速度,在CUDA_ARCH_BIN修改为2.1(该选项是根据GPU计算能力来选择的,我的计算能力为2.1)。我没有这么干,感觉也没啥关系。
2.6 再次点击configure,出现TBB路径未找到的问题,(红色标出),点击确定TBB的路径,我的为D:\Program Files\tbb43\include,再次点击configure,出现的红色两条要求配置TBB的lib路径和一个头文件的路径,默认已经找到,再次点击configure,若没有红色出现,且信息框中出现使用CUDA,TBB等信息后,再点击Generate,会在目标路径中生成OpenCV.sln文件,点击打开该文件。
至此,为编译源码的工作空间就已经建立好了,Cmake需要退出历史舞台,轮到VS2010出场了。
2.7 确定VS2010的状态为Debug x64,在视图--->属性管理器中找到ALL_BUILD,在Debug|x64(不是Microsft.Cpp.x64.user中,这里插播一条关于OpenCV配置的知识,在Microsft.Cpp.x64.user中的配置是默认配置,你在这上面修改会导致之后所有的项目都会继承此项配置,到后面会导致debug和release下的配置,修改一个另一个也会变,这样很麻烦)中双击,弹出属性配置页。
在可执行文件目录中,将
D:\Program Files\tbb43\bin\intel64\vc10
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin
在包含目录中,将
D:\Program Files\tbb43\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include
在库目录中,将
D:\Program Files\tbb43\lib\intel64\vc10
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib\x64
以此添加,选择保存。
2.8 配置好后,切回解决方案资源管理器中,在解决方案‘OpenCV’中,右击,重新生成解决方案。接下来开始了漫长的等待过程。在编译gpu模块时非常的慢。整个过程耗时视显卡计算能力和电脑配置而定,我的笔记本大概3个小时吧。
2.9 等编译完成后(总会有那么几个不成功的,如果数量太多就需要重来了。这里如果前面在Cmake没有勾选BUILD_EXAMPLES,那么任务数量只有60多个,但是成功率不高,会有很多不成功,不要问我是咋知道的),在CMakeTargets文件夹下的INSTALL中,右击,选择生成选项,又是一个漫长的等待过程,大概40-50分钟。
这个过程完成后,就完成了debug模式下的lib和dll文件的生成。会在install文件夹下的x64文件夹中:
D:\Program Files\opencv\VS2010\install\x64\vc10
2.10 这时候前辈的建议是“这时候可以先不急着编译release模式,你可以先验证一下debug模式下的编译是否正确。”
将自己编译生成的dll文件的目录添加到环境变量path中:D:\Program Files\opencv\VS2010\install\x64\vc10
之后,新建一个VS2010项目,在该项目中,将自己编译好的opencv的lib文件配置添加进去,
在debug x64模式下,VC++目录中配置包含目录:
D:\Program Files\opencv\install\include
D:\Program Files\opencv\install\include\opencv
D:\Program Files\opencv\install\include\opencv2
在库目录中添加:
D:\Program Files\opencv\install\x64\vc10\lib
添加lib文件 属性页,链接器,输入,附加依赖项带有d的是Debug,以下是debug的,不带d的是Release版本的。(参考OpenCV配置)
这里有点头疼的是,就算这里指定了路径,测试时候还是会提示找不到dll文件,最后没法子,只好把这些lib文件放到了C\:windows\System32下。
编写源文件,运行。测试程序如下:
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/gpu/gpu.hpp"
int main (int argc, char* argv[])
{
try
{
cv::Mat src_host = cv::imread("C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg");
cv::gpu::GpuMat dst, src;
cv::Mat result_host;
src.upload(src_host);
cv::gpu::cvtColor(src,dst,CV_BGR2GRAY);
cv::gpu::threshold(dst, dst, 128.0, 255.0, CV_THRESH_BINARY);
dst.download(result_host);
//cv::Mat result_host = dst;
cv::imshow("Result", result_host);
cv::waitKey();
}
catch(const cv::Exception& ex)
{
std::cout << "Error: " << ex.what() << std::endl;
}
// cv::imshow("result",src_host);
// cv::waitKey();
return 0;
system("pause");
}
运行结果如下:
说明debug模式下配置正确,接下来可以配置release模式,方法同上,注意将平台切换为Release x64即可。
需要注意的是,在编译过程总,如果出现关于宏的对话框,选择cancle,其他的对话框点击yes,要求重新加载的忽略。
3 搞定
总之,最后生成的install下的文件就是你的新的OpenCV路径,你需要把它当成OpenCV使用就可以了。对了,原则上每次配置完path路径都需要重启的,有时候忘了似乎也没啥影响。
参考: