cuda与openCV结合编程(一)

    学习计算机图像处理算法的童鞋,就不得不学习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与openCV的结合编程效率问题?哈,谁用谁知道,你不用也无需知道,有兴趣自己去测一下咯,反正笔者是墙裂推荐的,后面有空再讲效率问题。
三、常见错误
    1.cudaErrorMemoryAllocation,主要是申请空间太大,超出了GPU限制;
    2.cudaErrorLaunchFailure,访问了非法地址,比如index超过了数组大小;
    3.cuda与vs2015结合编程,偶尔会出现抽筋的问题,比如你这次编译出错,改正了以后再编译还出错,建议要重新编译时,把以前的编译生成的东西全删掉,这样就保险多了,笔者遇见多次这种情况;
  • 29
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值