【学习OpenCV】OpenCV的GPU模块(CUDA)的配置和例程(含OpenCV 3.0的说明)

最新版本的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的路径,如图所示

【学习OpenCV】OpenCV的GPU模块(CUDA)的配置和例程(含OpenCV 3.0的说明)_第1张图片

第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);	//高斯滤波


----------END-----------


你可能感兴趣的:(CUDA,opencv)