Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9140303
  • 博文数量: 1725
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19840
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1725)

文章存档

2024年(1)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2018-04-18 18:07:09

https://blog.csdn.net/sinat_31135199/article/details/53053188

持续对 Mat 进行翻转以及颜色控件转换, 在某个时间点突然发现会有CPU卡死的情况,看来用GPU是必须的.

OpenCV的GPU模块只支持NVIDIA的显卡,原因是该部分是基于NVIDIA的CUDA和NVIDIA的NPP模块实现的。而该模块的好处在于使用GPU模块无需安装CUDA工具,也无需学习GPU编程,因为不需要编写GPU相关的代码。但如果你想重新编译OpenCV的GPU模块的话,还是需要CUDA的toolkit。

由于GPU模块的发展,使大部分函数使用起来和之前在CPU下开发非常类似。首先,就是把GPU模块链接到你的工程中,并包含必要的头文件gpu.hpp。其次,就是GPU模块下的数据结构,原本在cv名字空间中的现在都在gpu名字空间中,使用时可以gpu::和cv::来防止混淆

需要再说明的是,在GPU模块中,矩阵的名字为GpuMat,而不是之前的Mat,其他的函数名字和CPU模块中相同,不同的是,现在的参数输入不再是Mat,而是GpuMat。

还有一个问题就是,对于2.0的GPU模块,多通道的函数支持的并不好,推荐使用GPU模块处理灰度的图像。有些情况下,使用GPU模块的运行速度还不及CPU模块下的性能,所以可以认为,GPU模块相对而言还不够成熟,需要进一步优化。很重要的一个原因就是内存管理部分和数据转换部分对于GPU模块而言消耗了大量的时间。

需要注意的是,在所有使用GPU模块的函数之前,最好需要调用函数gpu::getCudaEnabledDeviceCount,如果你在使用的OpenCV模块编译时不支持GPU,这个函数返回值为0;否则返回值为已安装的CUDA设备的数量。

还有一点就是使用GPU模块,需要在用CMake编译OpenCV时使其中的WITH_CUDA和WITH_TBB的宏生效,为ON。

由于我对GPU部分的熟悉程度还不行,先拿来一段sample自带的一段求矩阵转置的程序来做例子,代码如下:


点击(此处)折叠或打开

  1. #include <iostream>
  2. #include "cvconfig.h"
  3. #include "opencv2/core/core.hpp"
  4. #include "opencv2/gpu/gpu.hpp"
  5. #include "opencv2/core/internal.hpp" // For TBB wrappers

  6. using namespace std;
  7. using namespace cv;
  8. using namespace cv::gpu;

  9. struct Worker { void operator()(int device_id) const; };

  10. int main()
  11. {
  12.     int num_devices = getCudaEnabledDeviceCount();
  13.     if (num_devices < 2)
  14.     {
  15.         std::cout << "Two or more GPUs are required\n";
  16.         return -1;
  17.     }
  18.     for (int i = 0; i < num_devices; ++i)
  19.     {
  20.         DeviceInfo dev_info(i);
  21.         if (!dev_info.isCompatible())
  22.         {
  23.             std::cout << "GPU module isn't built for GPU #" << i << " ("
  24.                  << dev_info.name() << ", CC " << dev_info.majorVersion()
  25.                  << dev_info.minorVersion() << "\n";
  26.             return -1;
  27.         }
  28.     }

  29.     // Execute calculation in two threads using two GPUs
  30.     int devices[] = {0, 1};
  31.     parallel_do(devices, devices + 2, Worker());

  32.     return 0;
  33. }


  34. void Worker::operator()(int device_id) const
  35. {
  36.     setDevice(device_id);

  37.     Mat src(1000, 1000, CV_32F);
  38.     Mat dst;

  39.     RNG rng(0);
  40.     rng.fill(src, RNG::UNIFORM, 0, 1);

  41.     // CPU works
  42.     transpose(src, dst);

  43.     // GPU works
  44.     GpuMat d_src(src);
  45.     GpuMat d_dst;
  46.     transpose(d_src, d_dst);

  47.     // Check results
  48.     bool passed = norm(dst - Mat(d_dst), NORM_INF) < 1e-3;
  49.     std::cout << "GPU #" << device_id << " (" << DeviceInfo().name() << "): "
  50.         << (passed ? "passed" : "FAILED") << endl;

  51.     // Deallocate data here, otherwise deallocation will be performed
  52.     // after context is extracted from the stack
  53.     d_src.release();
  54.     d_dst.release();
  55. }


阅读(3184) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~