OpenCV3的GPU模块编译

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wolffytom/article/details/49976487

作者联系方式:cuijialiang@pku.edu.cn 有问题欢迎来讨论。

【摘要】

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

【关键词】OpenCV; GPU; CUDA; 编译器;

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

OS:Windows10 2015.11月更新后
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 错误,如下图:
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, 如果像@下图一样就是装好了:
CUDA环境变量
注意:楼主用的是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…],选择要生成的工程的路径。如下图:
CMake配置路径

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

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

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

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

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

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

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

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

可以欣赏一下OpenCV工程和源代码。如下图:
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

而自己编译后的会有很多,如下图:
NewLib
所以工程属性的[输入->外部依赖项]需要重设,设成编译后的lib下所有.lib的文件名即可。

4.测试

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

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

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

#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;
}

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

【参考文献】

  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
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页