最新版本的CUDA开发包下载:点击打开链接
本文基于 VS2012,PC是win7 x64,opencv2.4.9
编译opencv源码
参考《How to Build OpenCV 2.2 with GPU (CUDA) on Windows 7》,里面有点繁琐,大家可以看下面的
1、安装CUDA Toolkit,官方说明书:点击打开链接
安装过程就像普通软件一样,最后提示有的模块没有安装成功,我们不管,只要ToolKit装了就行。上面链接里说要安装SDK、NPP什么的,可能因为是旧版本的CUDA,现在6.0都集成在安装包里了,一次搞定!
2、CMake编译OpenCV
注意三个地方,缺一不可:
(1)CUDA的路径,如图所示
第1步安装好后,Cmake会自动寻找,不用我们设置。如果CUDA_TOOLKIT_ROOT_DIR_NOFOUNDED,请回去第1步!
(2)WITH_CUDA,默认是选中的。
(3)WITH_TBB,默认没有选中,记得勾上。tbb是需要自己安装的,参考http://www.cnblogs.com/freedomshe/archive/2013/01/11/win7_vs2012_opencv_rebuild.html
最后生成一个.sln
3、VS编译install
VS打开刚刚生成的sln,找到INSTALL项,右键生成,就开始编译了!请注意,编译时间比较长,我的机器E3 1250 耗时将近2个小时,所以先准备好一杯咖啡。编译完成后,得到一个新目录install,所有include、bin、lib都在里面了。整个项目文件夹大概6G多一点,比没有CUDA的时候多了差不多2G!好吧,开始享受cuda吧!
demo
附上一个简单的例程,可以用来检验CUDA平台是否搭建成功:
#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include "opencv2/gpu/gpu.hpp"
int _tmain(int argc, _TCHAR* argv[])
{
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);
std::cout<<"GPU is ready, device ID is "<<num_devices<<"\n";
cv::Mat src_image = cv::imread("你的路径\\lena.jpg",1);
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::namedWindow("test",0);
cv::imshow("test",dst_image);
cv::waitKey(0);
return 0;
}
需要注意的是,在所有使用GPU模块的函数之前,最好需要调用函数gpu::getCudaEnabledDeviceCount,如果这个函数返回值为0,同时你在命令行中能够看到“CUDA is no support”的错误,说明没有编译成功,重新回到第1步开始吧
------------------------------------------------------分割线--------------------------------------------------------------
OpenCV 3.0的CUDA模块
源码编译:http://blog.csdn.net/kelvin_yan/article/details/48708227
编译的大小为8.多G
相对2.x的改动
* 不再使用cv::gpu的命名空间,改用cv::cuda
* 头文件中需要单独引用
#include "opencv2/core.hpp"
#include "opencv2/cudaarithm.hpp"
#include "opencv2/cudafilters.hpp"
...
调用不同的cuda函数需要引用对应的头文件,这些头文件的说明参考:
http://blog.csdn.net/kelvin_yan/article/details/48734707
* 增加了一些函数,同时删除了一些函数,改变了某些函数的用法
例如,gpu::add、 gpu::multiply、gpu::subtract的形参有所改动,使用stream时与2.x版本是一样的
例如,滤波函数的调用方式也改变了,先要创建一个cv::Ptr<gpu::Filter>的对象,作为滤波器,然后调用该对象的apply方法进行实际滤波,以下为高斯滤波的例子:
cv::Ptr<cv::cuda::Filter> gauss = cv::cuda::createGaussianFilter(CV_32F, CV_32F, Size(11, 11), 1.5, 0, cv::BORDER_DEFAULT,-1); //创建高斯滤波器
gauss->apply(src, dst); //高斯滤波