【摘要】

OpenCV3的GPU模块需要手动重新编译才可以使用。本文介绍了编译OpenCV3 + GPU模块的方法。

【本文使用的操作系统、软件版本】

OS:Windows10
OpenCV 3.0.0 
CMake 3.4.0-rc 
CUDA v7.5 for windows10 x86_64 
Visual Studio 2013 Community

【正文】

1.前言

1.1.为什么要重新编译?

OpenCV3封装了许多可以直接从高层调用的基于GPU计算的方法。但是直接用官网下载的编译好的OpenCV3调用GPU命令会发生 No CUDA support 错误,如下图: 

错误描述中说 The library is compiled without CUDA support. 
OpenCV需要和CUDA模块一起编译,才可以使用GPU接口。

1.2.What is CUDA

NVIDIA官网 https://developer.nvidia.com/cuda-toolkit 的描述如下:

The NVIDIA® CUDA® Toolkit provides a comprehensive development environment for C and C++ developers building GPU-accelerated applications. The CUDA Toolkit includes a compiler for NVIDIA GPUs, math libraries, and tools for debugging and optimizing the performance of your applications. You’ll also find programming guides, user manuals, API reference, and other documentation to help you get started quickly accelerating your application with GPUs.

CUDA toolkit是NVIDIA的一个驱动包,封装了GPU硬件加速功能,屏蔽了硬件,提供方便调用的C/C++编程接口。

2.准备工具-安装CUDA

首先你的电脑需要有独显,且你的显卡支持CUDA。

2.1.检查显卡是否支持CUDA

注:楼主使用的是N卡(NVIDIA显卡),A卡(AMD显卡)貌似还不支持CUDA——-就好像天猫买东西不能用微信支付一样。A卡的童鞋抱歉了。

检查显卡是否支持CUDA步骤如下: 
Ⅰ.查看自己的显卡型号 
[win+R]打开[运行] -> 输入[cmd]按回车打开[命令行] -> 输入[start devmgmt.msc]按回车打开[设备管理器]。 
在显示适配器选项中看自己的显卡型号。双显卡的童鞋可能有两个显卡,注意要独显那个的型号…楼主的是GeForce GT 640,查看显卡型号如下图: 
 
Ⅱ.查看自己的显卡是否支持GPU 
去@Nvidia官网CUDA支持 https://developer.nvidia.com/cuda-gpus 查看自己的显卡是否支持CUDA。

2.2.下载安装CUDA Tookit

去@Nvidia官网https://developer.nvidia.com/cuda-downloads 选择系统型号,下载最新的CUDA Tookit,建议[Installer Type]选[exe(local)]。楼主用的是v7.5版本。 
下载后安装,有三个工具,全装上,装的时候不要有中文路径。建议cuda tookit安装到一个短一点的路径下。这个是你以后二次开发用的工具。楼主装在了@D:\dev\CUDA\v7.5。安装完建议重启一下。 
安装完可以检查一下环境变量有木有配置好:桌面上此电脑右键属性->高级系统设置->高级系统属性->高级->环境变量->系统变量中的Path, 如果像@下图一样就是装好了: 
 
注意:楼主用的是2015年11月中旬更新之后的windows10,和之前的@win7\8.x\没更新的10 的Path变量的界面不太一样。

3.重新编译OpenCV3

就是用Cmake重新生成一下64位(推荐)的OpenCV3,编译时勾上WITH_CUDA选项,一般这个默认是勾上的,全按照默认的就行了,注意不要勾BUILD_CUDA_STUBS项。然后再用VS编译一下。详细步骤如下。熟悉OpenCV编译的童鞋可以略过这一步了。

3.1.下载安装Cmake

去@Cmake官网 https://cmake.org/download/ 下载最新的Cmake工具并安装。楼主用的是3.4.0-rc版本。 
安装好后打开Cmake。

点[Brouse Source…],选择OpenCV源码那个sources文件夹的路径。 
点[Brouse Build…],选择要生成的工程的路径。如下图: 

点击 [Configure],出现对话框说文件夹不存在要不要新建文件夹,点yes,然后出现对话框选择生成的工程版本,如下图: 

楼主选的是VS2013 64位。楼主曾经选过VS2013 32位版本,但这样做后来的过程中会报错。建议选64位的。这样生成的运行库也是64位。貌似Cuda对64位的支持比较好。

点[Finished],一段读条后会生成工程。完成后可以检查一下窗口下部的框,如果正确安装、配置CUDA,应该会有如下字样 CUDA detected+版本号: 

检查一下WITH_CUDA选项,如果Cmake检测到你安装了CUDA,应该是自动勾上的。如果没自动勾上那就把它勾上。如下图: 

配置工程选项里有很多有cuda的项,楼主目前用到过的功能勾上这一个WITH_CUDA就够了,建议就按默认的,不要勾其他的选项。容易出错。等你成功配置熟悉之后再慢慢玩吧。 
另外要注意的是BUID_CUDA_STUBS这个选项 
千万不要选!千万不要选!千万不要选! 
这个相当于编译出一个CUDA的空壳子。选了这个就等于你的WITH_CUDA白选了。楼主在这个上面坑了挺久….

确认好选项之后再按[Configure]。出现的红色的项是有问题的。比如楼主的Python2项。不用python的话去掉么什么影响。如果不去掉后期楼主编译工程的时候会报一个错缺少头文件,但也不影响使用。

按[Generate]生成工程,如果配置和生成工程完全ok底下应该有Configuring done和Generating done两行。如下图: 

到这生产源码工程就OK了。记住刚刚设置的生成工程的路径,也就是Cmake界面上的Where to build the binaries:后边的路径,找到这个路径,Cmake就可以关了。 
这个路径下就是一个生成好的Visual Studio工程。用之前选择的编译器(VS2013)打开OpenCV.sln。如下图: 

可以欣赏一下OpenCV工程和源代码。如下图: 

按Ctrl+Alt+F7或者点[BUILD(生成)]->[Rebuild Solution(重新生成解决方案)]。开始编译。过程约2小时左右,看个电影吧……..

不要CUDA模块的OpenCV编译大概只需要几分钟。但是加上CUDA模块就变得特别特别特别特别。。。慢。。

编译好后应该不会有什么错。如果有一两个Matlab啊Python啊之类的错误请无视之。如果几十个几百个错可能就会很大程度上影响使用了。如果真的出错,可以注意下错误是什么,一起讨论一下。

编译好后,找到解决方案目录里的[CMakeTargets]项展开的[INSTALL]项,右键->[Project Only(仅项目)]->[Build Only INSTALL(仅生成INSTALL)]。

再次打开之前生成工程的目录,我的是@D:\dev\opencv\opencv300\build20151112 
找到install文件夹。这个文件夹就相当于原装OpenCV的那个build。只要把OpenCV环境变量指到这个下就能用新编译的OpenCV了。 
当然随便改环境变量也是挺麻烦的,楼主推荐大家用以下方法: 
找到原来的OpenCV的build文件夹,楼主的是@D:\dev\opencv\opencv300\build,将这个build文件夹改个名比如改成build_old,然后将新的install文件夹剪切过来,改名为build。这样就不用重新配置各种路径了。 
要注意之前如果是64位VC12生成的工程并且用DEBUG编译的OpenCV,新编译的OpenCV就只能用VC12 ×64 debug的运行库。

要注意一下OpenCV3.0自带编译好的运行库只有四个,如下图: 

而自己编译后的会有很多,如下图: 

所以工程属性的[输入->外部依赖项]需要重设,设成编译后的lib下所有.lib的文件名即可。

4.测试

4.1.测试程序:显示OpenCV3的GPU设备是否OK

搞定之后用VS建一个c++Console程序,如下图: 

配置调试器。注意用DEBUG x64的,没有的话新建一个。 
配置好工程属性中的[包含目录]、[库目录]、[输入->外部依赖项]。 
修改main函数所在文件如下:

<span style="color:#565f69"><span style="color:#333333"><code>#include "stdafx.h"
#include <iostream>
#include <opencv2\core\cuda.hpp>int _tmain(int argc, _TCHAR* argv[])
{cv::cuda::DeviceInfo _deviceInfo;bool _isDeviceOK = _deviceInfo.isCompatible();std::cout << "IsGPUDeviceOK : " << _isDeviceOK << std::endl;system("pause");return 0;
}</code></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

编译运行,如果检测到CUDA模块配置好了且GPU硬件设备正常,则会出现IsGPUDeviceOK:1,如下图: 

【参考文献】

  1. 《OpenCV官方文档》 http://docs.opencv.org/3.0.0/d2/dbc/cuda_intro.html
  2. 浅墨_毛星云 《玩转OpenCV源代码》 http://blog.csdn.net/poem_qianmo/article/details/21974023

OpenCV3的GPU模块编译相关推荐

  1. omap3530支持gpu模块

    在操作过程中如果遇到什么问题,可以直接1157207468@qq.com 或者 留言 进行沟通,如果有什么错误,也请大家进行指出. 环境: ubuntu 10.04  linux-2.6.32 oma ...

  2. OpenCV_Viz——OpenCV中Viz的模块编译的无法解析的外部符号BUG

    写在前面 由于实验室需要,需要重新编译医学图像第三方库全家桶.这里就需要编译OpenCV,而编译后查看编译的库文件中缺少一个opencv_viz2413d.lib文件(没错,这里可以看出我使用的Ope ...

  3. android 单个模块编译的方法

    单个模块编译的方法 $.build/envsetup.sh  mmm packages/apps/Contacts/ 示例编译联系人  这时生成  out/target/product/generic ...

  4. OpenCV之gpu 模块. 使用GPU加速的计算机视觉:GPU上的相似度检测(PNSR 和 SSIM)

    GPU上的相似度检测(PNSR 和 SSIM) 学习目标 在 OpenCV的视频输入和相似度测量 教程中我们已经学习了检测两幅图像相似度的两种方法:PSNR和SSIM.正如我们所看到的,执行这些算法需 ...

  5. 简单实例讲解linux的module模块编译步骤

    简单实例讲解linux的module模块编译步骤 (2014-10-24 10:19:17) 标签: module linux 分类:Linux/Unix 本文将直接了当的带你进入linux的模块编译 ...

  6. xgboost 多gpu支持 编译

    xgboost 多gpu支持 编译 Ubuntu 18.04.2Linux 4.15.0-46-genericgcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 cuda ...

  7. OpenCV中GPU模块使用

    CUDA IT168的文章系列: Cuda的初始化 :http://tech.it168.com/a2011/0715/1218/000001218458.shtml OpenCV: OpenCV中G ...

  8. android.mk 模块编译,通过Android.mk添加一个编译模块到系统中的顺序如下

    ①LOCAL_PATH ②CLEAR_VARS ③LOCAL_SRC_FILES ④LOCAL_CFLAGS(可选) ⑤LOCAL_MODULE ⑥LOCAL_STATIC_LIBRARIES(可选) ...

  9. java 位运算取8位_Java 9 AOT 试用:仅支持 64 位 Linux和java.base 模块编译

    Java 9 引入了 aot 编译方式,能够将 class 文件直接编译成可执行二进制文件.目前 Java 9 的 early access 版本已经提供了编译工具,让我们来看看它的功能吧. 注意:按 ...

最新文章

  1. 【硅谷牛仔】Facebook最初的CEO肖恩帕克
  2. 点云分割 PointCloudSegmentation测试笔记
  3. 从String中移除空白字符的多种方式!?差别竟然这么大!
  4. 学完可以解决90%以上的数据分析问题-利用python进行数据分析第二版(代码和中文笔记)...
  5. 【 Grey Hack 】反向Shell
  6. Nginx安装手册(摘自入云龙老师教案,亲测可用)
  7. 往java里输入坐标值_java.让用户输入x坐标,和y坐标。当用户输入完x坐标(比如200),敲enter,...
  8. Mysql替换字段中的内容
  9. 收藏~10年软件测试人员的工作方法进阶汇总
  10. python中的translate_Python3 translate()方法
  11. Windows编译OpenCV
  12. OA系统四级模块编写测试用例(用户模块)
  13. 基于STM32F405平台的多摩川协议编码器通讯过程(1)
  14. STM8S003F3 UFQFPN20 ADC采样电压
  15. pdf打印机有什么功能
  16. HTML5小游戏源码收藏
  17. 光电特性传感器实验台
  18. 如何在win10下安装Docker
  19. 见山只是山 见水只是水——提升对继承的认识
  20. 郑州财经学院第54次全国计算机,郑州财经学院第二期教师博士班开班

热门文章

  1. 笔刷分享|每个建模人都在用的笔刷合集
  2. 初学者都能学会的ElasticSearch入门实战《玩转ElasticSearch 2》
  3. 我失业了,公司与我解除劳动合同关系
  4. 帝国时代2 使用ipx不能互联的解决
  5. HUAWEI华为MateBook 13 2020款 锐龙版 R7 集显 触屏 16GB+512GB (HNL-WFP9Q)原装出厂系统恢复原厂系统
  6. 《视觉SLAM十四讲》笔记(1-3)
  7. python计算时间差的方法_如何计算时间差,用Python算法的话
  8. ubuntu安装时姓名、计算机名、用户名的含义
  9. STM32G070RBT6迷你开发板制作总结
  10. 一年200多天不上网 看远望7号船员怎么玩抖音