1.注意事项

编译的办法参见:

http://blog.csdn.net/wangyaninglm/article/details/39997113

 

以下是程序代码,网上搜的例子:

注意事项:32位工程添加64位的支持(主要取决于你编译的版本),配置好cuda的项目路径include


2.代码

//swap.cu

#include "cuda_runtime.h"
#include "device_launch_parameters.h" #include <opencv2/core/cuda_devptrs.hpp>
using namespace cv;
using namespace cv::gpu; //自定义内核函数
__global__ void swap_rb_kernel(const PtrStepSz<uchar3> src,PtrStep<uchar3> dst)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y; if(x < src.cols && y < src.rows)
{
uchar3 v = src(y,x);
dst(y,x) = make_uchar3(v.z,v.y,v.x);
}
} extern "C" void swap_rb_caller(const PtrStepSz<uchar3>& src,PtrStep<uchar3> dst,cudaStream_t stream)
{
dim3 block(32,8);
dim3 grid((src.cols + block.x - 1)/block.x,(src.rows + block.y - 1)/block.y); swap_rb_kernel<<<grid,block,0,stream>>>(src,dst);
if(stream == 0)
cudaDeviceSynchronize();
}
//swap.cpp

#include <opencv2/gpu/gpu.hpp>
#include <opencv2/gpu/stream_accessor.hpp> using namespace cv;
using namespace cv::gpu; extern "C" void swap_rb_caller(const PtrStepSz<uchar3>& src,PtrStep<uchar3> dst,cudaStream_t stream); extern "C" void swap_rb(const GpuMat& src,GpuMat& dst,Stream& stream = Stream::Null())
{
CV_Assert(src.type() == CV_8UC3);
dst.create(src.size(),src.type());
cudaStream_t s = StreamAccessor::getStream(stream);
swap_rb_caller(src,dst,s);
}
//main.cpp

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp> #pragma comment(lib,"opencv_gpu2410d.lib")
#pragma comment(lib,"opencv_core2410d.lib")
#pragma comment(lib,"opencv_highgui2410d.lib") using namespace cv;
using namespace cv::gpu; extern "C" void swap_rb(const GpuMat& src,GpuMat& dst,Stream& stream = Stream::Null()); int main()
{
Mat image = imread("lena.jpg");
imshow("src",image);
GpuMat gpuMat,output; gpuMat.upload(image);
swap_rb(gpuMat,output);
output.download(image); imshow("gpu",image);
getchar();
waitKey(0);
return 0;
}

3.实现效果:

4.其他注意事项

假设有两个工程:CUDA工程TestCuda;C++工程CallCuda

1. 在CUDA工程TestCuda中,

(1).cpp文件(类成员函数定义)调用.cu文件下的函数

例如.cu文件下的函数void run_kernel(); 其前面必须用 extern “C” 修饰。

而.cpp文件(类成员函数定义)下的类成员函数,如,void cpp_run();

如果它想调用 run_kernel(),则首先可在.h文件(类定义)中的类定义的外面先声明.cu文件下的C函数,例如,extern “C” void run_kernel();

(2)CUDA工程属性-->常规中,选择配置类型为“静态库(.lib)”-->应用;

同时在工程属性下的库管理器-->常规项下的附加依赖项中,添加CUDA库:cudart.lib,curand.lib等;在附加库目录添加相应的库所在目录。

2.另外的C++工程CallCuda

在CallCuda工程属性下,找到附加依赖项,添加:CUDA库(cudart.lib等)和TestCuda生成的静态库(TestCuda.lib);以及添加附加库目录。

至此,该工程下的.cpp文件下的函数,就可以调用CUDA工程下的cpp_run()函数了,不过首先要实例化类。

1.将example.cu添加到工程中。在已有工程上右键单击,选择添加已有项。
2.添加编译规则。右键单击工程文件,选择“自定义生成规则”,在弹出的对话框中选择CUDA Build Rule x.x。
3.修改.cu文件的编译器。右键单击.cu文件,单击属性,修改编译规则,选择刚才添加的CUDA编译器。
4.添加包含目录。在项目属性-》C++->常规->附加包含目录中添加CUDA SDK的目录。例如"C:\Program Files\NVIDIA Corporation\NVIDIA GPU Computing SDK 3.2\C\common\inc";"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include"
5.添加.lib文件。在链接器-》输入中添加cudart.lib cutil32D.lib
6.修改代码生成为多线程(/MT)方式。
7.Done. 
 
以上是工程配置。 
除此之外,还要把调用cuda代码的c++函数在.cu文件中用extern "C" 包含起来。并且在调用文件.cpp中用extern "C"声明该函数,然后调用。 

CUDA跟OpenCV的混合编程,注意OpenCV需要重新编译的更多相关文章

  1. matlab和C/C++混合编程--调用opencv

    最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...

  2. Matlab与C++混合编程(依赖OpenCV)

    Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...

  3. [转] Matlab与C++混合编程(依赖OpenCV)

    作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...

  4. [转] Matlab与C++混合编程,添加OpenCV库

    原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...

  5. Matlab与C++混合编程,添加OpenCV库

    最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...

  6. mpi和cuda混合编程的正确编译

    针对大数据的计算,很多程序通过搭建mpi集群进行加速,并取得了很好的效果.算法内部的加速,当前的并行化趋势是利用GPU显卡进行算法加速.针对并行性非常好的算法,GPU加速效果将远大于集群带来的加速效果 ...

  7. CUDA+OpenGL混合编程

    CUDA+OpenGL混合编程示例: #include <stdio.h> #include <stdlib.h> #include "GL\glew.h" ...

  8. javacpp, javacv: 封装了FFmpeg、OpenCV等计算机视觉编程人员常用库的接口

    jvavacpp:     一个java调用jni的库,支持安卓. javacv:      封装了FFmpeg.OpenCV等计算机视觉编程人员常用库的接口,可以通过其中的Utility类方便的在包 ...

  9. matlab 2012 vs2010混合编程

    电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...

随机推荐

  1. FFmpeg源代码简单分析:结构体成员管理系统-AVOption

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  2. Servlet之Session处理

    HttpSession 对象中可用的几个重要的方法: 1    public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象 ...

  3. EBS 客户表结构

     客户表/联系人/PARTY关联 HZ_PARTIES 客户账户表 HZ_CUST_ACCOUNTS SELECT hp.party_number --客户注册标识 , hp.party_name ...

  4. C语言获取文件大小

    C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在C语言中就比较麻烦,例如获取一个文件的大小.Java中File类有个length函数,Python中os.path包中有个getsize ...

  5. Dynamics CRM 修改数据导出到EXCEL的最大条数

    系统默认的最大导出数为一万,这个数可以通过执行以下SQL看到,那要增加导出的最大数量改变MaxRecordsForExportToExcel的值即可. <span style="fon ...

  6. 【一天一道LeetCode】#326. Power of Three

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  7. Android初级教程Activity小案例(计算器乘法运算)

    首先设置两个布局文件,一个布局文件进行输入数据,获取加法运算:另一个布局文件进行显示最终结果.Activity1启动Activity2,并传递计算结果值给Activity2. main.xml: &l ...

  8. 钩子不仅仅是windows给你留的后门

    说起钩子(Hook)熟悉windows开发的人应该比较熟悉,例如鼠标钩子.键盘钩子等.用简单的语言描述就是在正常处理流程中安置某个钩子,当执行到安置钩子的地方就将进入指定的钩子函数进行处理,待处理完再 ...

  9. C语言中的内存分配

    对于一个C语言程序而言,内存空间主要由以下几个部分组成: 1)程序代码区:用来存储程序的二进制代码 2)全局区/静态存储区 3)BSS段:用来存储未初始化的全局变量和静态变量. 4)栈区:存储局部变量 ...

  10. velocity 时间显示 时间格式化 时间转化

    思想:通过前台展现层(Velocity)中的工具(tools)方法来修改. *************** 具体修改步骤: 1.在toolbox.xml配置文件中添加以下代码: <tool> ...