OK,第一篇博文~~快忘了怎么写文章了,先从记述流水账开始吧~~。
不知道从哪代起opencv支持GPU了~~~fantastic news!!!
But~how to configure it in a certain environment ? 作为涨停板敢死队的一员,我奋不顾身的投入到了鼓捣的行列中去...其实是光用CPU真太慢了..
反复失败了快一个礼拜终于成功了 记录下来方便大家~~~哦哈哈哈哈哈 点赞点赞
正文:
1. 环境设定与所需软件
WIN7x64+VS2013+Opencv2.4.11+CUDA7.0+cmake3.2.3
Opencv2.4系列的应该都能支持本文,目测2.3也可一试,3.0不行~~~因为文件结构又变了(...脑洞大开)
GPU部分,当然既然是CUDA,你的电脑里要确保有一张nvidia的显卡,我的是GT635M(...弱)
需要最新显卡驱动的可以去http://www.nvidia.cn/Download/index.aspx?lang=cn
需要CUDA7.0工具箱的可以去https://developer.nvidia.com/cuda-toolkit
另外需要特别记住的是去 网页https://developer.nvidia.com/cuda-gpus,记下你的显卡对应的compute capability号 非常重要哦亲~~我就在这里停顿了2天,蠢哭..所以先mark下
CMAKE部分,网上有文章说2.8以后的比较安全,我用的是3.2成功了,所以大家可以使用3.0前后的版本,问题不大,什么,cmake去哪里下...出门左拐baidu谷粉去...
当然,你需要一个系统软件,我用的是WIN7x64 所以以下步骤适用于64位哦
当然,你还需要一个编译软件,我用的是VS2013,以下同样适用于2010,2012,blablabla~~~~
另外,其实还需要一个TBB,后面会讲到,先说一下,去这里下载https://www.threadingbuildingblocks.org/。
2. 编译与工程生成
首先,将opencv包解压到文件夹中,我的路径是E:\opencv2411\opencv\,解压后里面出现两个文件夹,build和sources两个子文件夹,build里面是预编译好的opencv,按照经典的配置方法可以直接用的库和执行文件,sources里顾名思义,就是源码啦,源码什么的最棒了~~~
然后,以管理员身份登录,安装好cmake,cudatoolkit7.0(装在默认路径中),TBB(解压就可以)和VS,注意所有路径不能有中文和奇奇怪怪的符号,否则后面会有莫名其妙的错误。
检查环境变量配置,打开控制面板->系统和安全->系统,选择高级系统设置->高级->环境变量。在系统变量一栏里找到Path一栏,以分号间隔添加CUDAbin和TBBbin的位置,记住要添加对应x64和VC12(即VS2013)的版本路径,我添加的是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0和D:\tbb43_20150611oss_win\bin\intel64\vc12\,当然在安装cuda的时候默认是会自动添加进去的,所以一般来说只需要检查一下cuda路径是否有,并同时手动添加tbb就可以了。
打开cmake-gui,在where is the source code处导入soureces文件夹E:/opencv2411/opencv/sources,在where to build the binaries处填写要放置opencv工程的地址,我的是E:/opencv2411/build。点击Configure编译,弹出窗口选择Use default native compilers,Visual Studio 12 2013 Win64,点击FInish。
电脑巴拉巴拉开始动了有没有,聪明的小脑瓜滴溜溜地转着,不一会儿就好了...窗口里.出了一大堆红条,现在对他们进行操作:
保持BUILD_DOCS和BUILD_EXAMPLES后面的勾勾为未选中状态,保持WITH_TBB,WITH_OPENCL,WITH_CUBLAS,WITH_CUDA,WITH_CUFFT后面的勾勾为选中状态。来到CUDA_ARCH_BIN处,还记得我让你们看的compute capability号吗,派上用场咯,只保留你显卡对应的计算能力号,我的是2.1,所以保留2.1(2.0),然后将CUDA_ARCH_PTX选项清空。之后点击软件中第三行的Advanced选框,会出现很多二级选项,找到CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE,保持其未选中状态,完事后再点Configure。红条条少了很多有木有,在TBB_INCLUDE_DIRS处加入TBB的include路径,我的是D:/tbb43_20150611oss_win/include,之后继续Configure。又跳出来两个红条子,在TBB_LIB_DIR里填入TBB的lib路径,要64和VC12的哦,我的是D:/tbb43_20150611oss_win/lib/intel64/vc12,另外TBB_STDDEF_PATH中填写tbb_stddef.h的路径,我的默认值D:/tbb43_20150611oss_win/include/tbb/tbb_stddef.h,继续Configure....萌萌哒全部变白啦有木有。检查一下,状态栏里是否写着USE TBB YES 和 USE CUDA YES啊,有就说明编译完成。之后点击Generate,就可以在指定路径下生成Opencv工程文件啦~~
3.INSTALL过程
在生成的工程文件夹下,有一个OpenCV.sln,对其单击右键选择-管理员取得所有权,之后用VS2013打开~~~芝麻开门~~~~可以看到opencv大部分有用的源码都已经整齐的躺在了各自的工程里(开源真好)。
第一步,在工具条中选择视图-其他窗口-属性管理器,然后在右面选框里找到属性管理器窗口,在ALL_BUILD下可以看到有Debug|x64和Release|x64两个文件夹,注意一定是x64哦。对Debug下的Microsoft.Cpp.x64,user单击右键,选择属性,在C++目录中加入以下路径(均为我电脑上的路径,各位根据自己安装位置修改下):
可执行文件目录:D:\tbb43_20150611oss_win\bin\intel64\vc12,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\bin,E:\opencv2411\opencv\build\x64\vc12\bin
包含目录:D:\tbb43_20150611oss_win\include,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\include,E:\opencv2411\opencv\build\include,E:\opencv2411\opencv\build\include\opencv,E:\opencv2411\opencv\build\include\opencv2
库目录:D:\tbb43_20150611oss_win\lib\intel64\vc12,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\x64,E:\opencv2411\opencv\build\x64\vc12\lib
之后用与上文同样的方法在系统path中添加E:\opencv2411\opencv\build\x64\vc12\bin
回到解决方案资源管理器,找到CMakeTargets下的INSTALL,分别在选定Debug和Release模式下对其进行build~~~,于是你可以起身去泡个咖啡、奶茶、泡面、妞......然后等..等灯等灯~~~。大约2小时候,如果没有错误,你就可以在工程文件夹的install文件夹里得到新的牛逼闪闪的带gpu模块的opencv啦~~~(如果出了错误类~~~之后再说)。
4.使用新的库
怎么用呢,新的库,怎么用呢....还是讲一讲吧。首先来说,我们的库是64位的,所以对应的我们的application也要是64的哦,再者,新的库主要用到的依然是include,bin和lib三个文件夹,他们在哪里呢,就在install文件夹里自己找去....
配置方式与一般的opencv配置一样,唯一与默认库不同的是,我们需要一个x64的工程,而非win32。由于不知道什么的原因,新建工程时只能选择Win32控制台,所以在建立一个控制台程序后,在其项目属性页中选择配置管理器,在平台下拉菜单中选择新建,新平台选择x64,复制设置选择Win32,确定后,将你的项目平台改为x64。你可以在属性管理器中查看是否多出了Debug|x64和Release|x64选项,有就说明成功了。之后按照老三样::系统环境变量、C++目录、连接器-输入-附加依赖项~~配置完毕。
导入一个GPU测试程序进去,是不是发现可以用了~~~~~~yu~~~~鼓掌~~~
发个网上的测试代码:
#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp>
#include <iostream>
using namespace std;
int main()
{
int num_devices = cv::gpu::getCudaEnabledDeviceCount();
if (num_devices <= 0)
{
std::cerr << "There is no device." << std::endl;
return -1;
}
int enable_device_id = -1;
for (int i = 0; i < num_devices; i++)
{
cv::gpu::DeviceInfo dev_info(i);
if (dev_info.isCompatible())
{
enable_device_id = i;
}
}
if (enable_device_id < 0)
{
std::cerr << "GPU module isn't built for GPU" << std::endl;
return -1;
}
cv::gpu::setDevice(enable_device_id);
cv::Mat src_image = cv::imread("1.JPG");
cv::Mat dst_image;
cv::gpu::GpuMat d_src_img(src_image);
cv::gpu::GpuMat d_dst_img;
cv::gpu::cvtColor(d_src_img, d_dst_img, CV_BGR2GRAY);
d_dst_img.download(dst_image);
cv::imshow("test", dst_image);
cout << "succeed" << endl;
cv::waitKey(5000);
return 0;
}
5.尼玛出现错误了~~怒摔
5.参考文献:
乌拉拉,睡觉去了,困了......