IceSandwich

VS中OpenCV和Cuda结合编程

开发OpenCV与Cuda结合编程

字数统计: 795阅读时长: 3 min
2020/04/05 Share

折腾贼久终于搞好VS中开发Cuda与OpenCV了。。。

环境

  • OpenCV 3.4
  • Cuda 10.2
  • Visual Studio 2017

步骤

第一步 创建项目

创建VC++控制台应用,不要选NVIDIA项目。

第二步 设置CUDA编译

右击项目->生成依赖项->自定义,在弹出的对话框勾上CUDA,没有的话说明CUDA没装好。

第三步 设置引用目录和库目录

右击项目->属性,注意配置平台选择合适的选项,这里我选择所有配置x64,表示DebugRelease模式都是这个配置而且生成64位程序。

VC++目录中设置包含目录库目录,包含目录有:

  • ${OpenCV构建目录}\install\include

  • ${CUDA安装目录}\include

图中由于需要我加上了Eigen,可以不加的。库目录有:

  • ${OpenCV构建目录}\install\x64\vc15\lib

  • ${CUDA安装目录}\lib\x64

这里vc15是根据visual studio版本定的,最好去看看这个目录是否存在。

第四步 设置库

设置链接器->输入附加依赖项,填入一堆依赖。

这些依赖怎么来的呢?用cmd输入以下命令:

1
2
3
cd ${CUDA安装目录}\lib\x64
ls > a.txt
cat a.txt

补充说明:这里ls和cat的命令是调用了msys的程序,Windows默认是没有这些命令的,msys是一个模拟Linux环境的工具。

输出的内容中除去a.txt就是我们要填进去的依赖啦。或者用ls | cat也行,这样就不用手动删a.txt了。直接用ls的话文件名不分行,得配合cat命令使用。

除了上面这些,还有${OpenCV构建目录}\install\x64\vc15\lib这个,操作一样的。

第五步 创建cu文件

右击源文件->添加->新建项,这次我们选择NVIDIA CUDA C/C++ File就行。

现在基本能够运行了。

测试

以下简单提供测试的代码,功能是反转图片颜色:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* 文件:test.cu */
#include <opencv2/core/cuda.hpp>
#include <cuda_runtime.h>
using namespace cv::cuda;

__global__ void kernel_revert(const PtrStepSz<float3> m, PtrStep<float3> o) {
const int x = blockIdx.x * blockDim.x + threadIdx.x;
const int y = blockIdx.y * blockDim.y + threadIdx.y;

if (x >= m.cols || y >= m.rows) return;

const float3 *p(&m.ptr(y)[x]);

o.ptr(y)[x] = make_float3(1.0 - p->x, 1.0 - p->y, 1.0 - p->z);
}

void revert(const GpuMat& m, GpuMat& output) {
dim3 threads(32, 32);
dim3 blocks((m.cols + threads.x - 1) / threads.x, (m.rows + threads.y - 1) / threads.y);

kernel_revert <<<blocks, threads>>> (m, output);

cudaThreadSynchronize();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 文件:main.cpp */
#include <opencv2/opencv.hpp>
#include <opencv2/core/cuda.hpp>
using namespace cv::cuda;

extern void revert(const GpuMat& m, GpuMat& output);

int main() {
cv::Mat img = cv::imread("test.jpg");
cv::Mat imgf, o; GpuMat m;
GpuMat s = createContinuous(img.rows, img.cols, CV_32FC3);
img.convertTo(imgf, CV_32FC3, 1 / 255.0);
m.upload(imgf);
revert(m, s);
s.download(o);
cv::imshow("input", imgf); cv::imshow("output", o);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}

运行结果:

参考

[1] 配置OpenCV+CUDA https://blog.csdn.net/stjuliet/article/details/83957512

[2] OpenCV+CUDA混合编译 https://www.cnblogs.com/br170525/p/8331640.html

[3] 动态库与静态库链接 https://blog.csdn.net/weixin_39212021/article/details/78884830

[4] CMake联合编译 https://blog.csdn.net/fb_help/article/details/79330815

[5] NVCC使用 https://blog.csdn.net/bendanban/article/details/8518382

CATALOG
  1. 1. 环境
  2. 2. 步骤
    1. 2.1. 第一步 创建项目
    2. 2.2. 第二步 设置CUDA编译
    3. 2.3. 第三步 设置引用目录和库目录
    4. 2.4. 第四步 设置库
    5. 2.5. 第五步 创建cu文件
  3. 3. 测试
  4. 4. 参考