学习计算机图像处理算法的童鞋,就不得不学习cuda,为啥呢?因为图像处理一般都是矩阵运算,动不动就是百万的计算量这个时候优化计算时间是必不可少的。openCV本身提供了很多cuda函数,能够满足大多数用户的需求。但是也不绝对,有时候我们需要自己定义一个内核函数进行优化,当然你也可以用openGL或者多线程,openCV也提供较好的支持,掌握一种或多种加速算法,对程序员特别是算法工程师来讲很重要。
闲话不多说,再学习了cuda的基础以后【 cuda并行编程基础(一)、 cuda并行编程基础(二)】,我们其实就具备与opencv联合编程的能力,虽然不是最佳优化,但已经可以满足大多数需求了。
一、cuda与openCV结合方法
(下面仅涉及windows环境)
1.我们知道,cuda代码一般以.cu结尾(windows,其他系统除外,下同),它的编译器是nvcc,编译时它会将CPU代码和GPU代码分开,CPU部分其实与gcc编译差不多,GPU部分就按照nvcc的规则编译,这玩意其实并不复杂;
2.openCV的代码一般都是以.cpp结尾,它的编译器一般是gcc、g++(或者其他相似编译器),那么可不可以将openCV代码用nvcc编译呢?答案是肯定的,但在windows系统,你得把它改为.cu结尾.
3.所以,在windows系统里面,你有两种办法让openCV结合cuda编程:
a.openCV正常编译,cuda代码编译好后,作为静态库引入openCV调用;
b.openCV与cuda代码混在一起,统一用nvcc编译。
二、如何编写代码
(下面openCV基于3.2.0版本)
openCV是一个非常强大的视觉算法库,当然也支持cuda咯。
cv::cuda是一个专门处理cuda的命名空间,你在这个命名空间里面可以看到很多已经集成好的函数。
如:cuda::remap()、cuda::add()等
我们要用到的是cuda::PtrStepSz<T>的模板,以及cuda::GpuMat
比如:如果我们有一个cuda::GpuMat类型的img,我们怎么传入cuda里面呢?答案就是,直接将img传到cuda::PtrStepSz里面,他们是不是等同,但是可以互传数据,具体见样例。至于传到cuda::PtrStepSz里面如何操作,那就跟cuda差不多了。
除了cuda::PtrStepSz,openCV还有其他接口可以提供互传,自己去摸索啦,这里就不啰嗦了。
闲话不多说,再学习了cuda的基础以后【 cuda并行编程基础(一)、 cuda并行编程基础(二)】,我们其实就具备与opencv联合编程的能力,虽然不是最佳优化,但已经可以满足大多数需求了。
一、cuda与openCV结合方法
(下面仅涉及windows环境)
1.我们知道,cuda代码一般以.cu结尾(windows,其他系统除外,下同),它的编译器是nvcc,编译时它会将CPU代码和GPU代码分开,CPU部分其实与gcc编译差不多,GPU部分就按照nvcc的规则编译,这玩意其实并不复杂;
2.openCV的代码一般都是以.cpp结尾,它的编译器一般是gcc、g++(或者其他相似编译器),那么可不可以将openCV代码用nvcc编译呢?答案是肯定的,但在windows系统,你得把它改为.cu结尾.
3.所以,在windows系统里面,你有两种办法让openCV结合cuda编程:
a.openCV正常编译,cuda代码编译好后,作为静态库引入openCV调用;
b.openCV与cuda代码混在一起,统一用nvcc编译。
二、如何编写代码
(下面openCV基于3.2.0版本)
openCV是一个非常强大的视觉算法库,当然也支持cuda咯。
cv::cuda是一个专门处理cuda的命名空间,你在这个命名空间里面可以看到很多已经集成好的函数。
如:cuda::remap()、cuda::add()等
我们要用到的是cuda::PtrStepSz<T>的模板,以及cuda::GpuMat
比如:如果我们有一个cuda::GpuMat类型的img,我们怎么传入cuda里面呢?答案就是,直接将img传到cuda::PtrStepSz里面,他们是不是等同,但是可以互传数据,具体见样例。至于传到cuda::PtrStepSz里面如何操作,那就跟cuda差不多了。
除了cuda::PtrStepSz,openCV还有其他接口可以提供互传,自己去摸索啦,这里就不啰嗦了。
至于cuda与openCV的结合编程效率问题?哈,谁用谁知道,你不用也无需知道,有兴趣自己去测一下咯,反正笔者是墙裂推荐的,后面有空再讲效率问题。
三、常见错误
1.cudaErrorMemoryAllocation,主要是申请空间太大,超出了GPU限制;
2.cudaErrorLaunchFailure,访问了非法地址,比如index超过了数组大小;
3.cuda与vs2015结合编程,偶尔会出现抽筋的问题,比如你这次编译出错,改正了以后再编译还出错,建议要重新编译时,把以前的编译生成的东西全删掉,这样就保险多了,笔者遇见多次这种情况;
三、常见错误
1.cudaErrorMemoryAllocation,主要是申请空间太大,超出了GPU限制;
2.cudaErrorLaunchFailure,访问了非法地址,比如index超过了数组大小;
3.cuda与vs2015结合编程,偶尔会出现抽筋的问题,比如你这次编译出错,改正了以后再编译还出错,建议要重新编译时,把以前的编译生成的东西全删掉,这样就保险多了,笔者遇见多次这种情况;