【计算机视觉】关于OpenCV中GPU配置编译的相关事项
【计算机视觉】关于OpenCV中GPU配置编译的相关事项
标签(空格分隔): 【计算机视觉】
前一段发现了OpenCV中关于GPU以及opencl的相关知识,打算升级一下对OpenCV的使用,但是发现从OpenCV官网上下载的都是没有WITH_CUDA这一选项的。于是必须进行OpenCV带CUDA的重编译!下面就记录这一阶段出现的一系列问题。
- 关于OpenCV版本的问题
起初直接尝试使用一直用的OpenCV2.4.9的源码进行编译,选择的编译环境为Visual Studio2010 x64,因为前面在使用cuda的时候就已经遇到过关于CUDA的库对于32位程序的不全面支持,即CUDA的较高版本好像有一些64位的库在32位中是没有的。所以,直接选择了x64的平台。而此时我使用的CUDA版本为8.0。总之,编译OpenCV中出现了一系列莫名其妙的问题,在网上也不好查看。最后尝试了使用OpenCV2.4.13版本,听说是2016年更新的版本,所以应该能跟CUDA8.0匹配。首先只是将OpenCV2.4.13的源码替换了OpenCV2.4.9的源码,然后再去编译的,debug版本爆出了无法排除的错误,而release版本居然生成成功了,但是我使用这些库的时候总是说CUDA function API call错误之类,应该是还是没有配置成功。这一问题让我都想放弃了OpenCV中关于CUDA的使用了。后来一再坚持,然后决定使用Visual Studio 2015进行编译。这里说明一下,我用CMAKE进行编译的时候可选的本地编译器有10,13,和15版本的。当时想使用13版本的win64,但是好像configure不过,于是一直使用10版本,即使打开的时候用的是13版本,但是还是报错。
后来猛然间醒悟,极有可能是编译器版本的问题,于是使用CUDA8.0+OpenCV2.4.13+Visual Studio 2015 x64
配置,不管是Debug版本还是Release版本都生成成功了,这全部是最新版本的相互之间的匹配。
- 关于CMAKE的配置选项
一个是要选择WITH_CUDA,然后是选择capabilities,我的笔记本是GTX860M对应的为5.0,我查了一下后面要部署的显卡GTX1060为6.1,我把这两项加了进去,其实还有一个GPU架构的选项,好像不选的话就是对应自动,但是里面还好像只有开普勒和费米架构?我配置成功的这次没有选择。另外,好像用10版本的配置这个能力的时候居然配置不成功,不知道啥原因。
关于我电脑上OpenCV版本控制的说明
(1)保留D盘根目录下的OpenCV2.4.9与OpenCV2.4.13,这两个都是基于微软的MSVC编译器的,其中OpenCV2.4.13版本中的x64中对应的vc14路径下为带CUDA-GPU配置的动态链接库。
(2)在F盘根目录下的opencv2.4.13是对应x64版本的CUDA-GPU编译工程,可以保留,以后又需要在进行修改。
(3) 在F盘根目录下的OpenCV2.4.9-MinGW为对应MinGW gcc编译器的动态链接库,可以在Qt-gcc下编译使用,在编写跨平台的工程时可以使用Qt的这个版本。保留工程文件!下面是一些引文参考:
近期由于课题需要使用GPU进行加速,通过调研决定采用OpenCV 的GPU 支持,通过整整一天的摸索,终于配置成功。
1. 系统环境
windows 7 ultimate版 64位+ visual studio 2010 ultimate版+OpenCV 2.4.9+CUDA ToolKit 6.5+CMake2.8.8
2. 配置过程
大致流程:CUDA Toolkit 6.5的下载与安装--> CMake的下载与安装--> OpenCV的下载与编译-->测试是否安装成功
2.1 CUDA ToolKit 6.5的下载与安装
由于之前测试直接使用OpenCV的预编译的版本,无法使用其GPU模块,因此需要安装CUDA Toolkit之后,使用自己的基于CUDA 编译的OpenCV 库。
由于自己配置时,CUDA ToolKit版本是7.0,于是尝试了一下,结果不成功,原因估计是Opencv2.4.9的gpu模块对最新的CUDA支持不够完善,因此在选择CUDA 版本时,一定要考虑OpenCV对其的兼容性。自己的一个经验是到 http://code.opencv.org/projects/opencv/wiki/ChangeLog 看一下自己的OpenCV 版本发布的时间;再到CUDA下载的页面找一个发布时间与OpenCV发布时间相近的版本;选择合适的版本很重要;自己花费的主要时间就浪费在版本不兼容上~~~
自己使用的是CUDA ToolKit 6.5,根据自己的系统,计算需求,下载对应的版本,一路安装就可以了。这个问题应该都不大,主要是确定OpenCV 与CUDA 的兼容性。
2.2 CMake 工具的下载与安装
到http://www.cmake.org/files/ 下载任何自己需要的版本(虽然我的win7系统是64位的,但是只有32位的CMAKE 供下载,cmake-2.8.8-win32-x86.exe, 这个对后面的编译木有影响),我使用的是2.8.8,下载完成,安装就OK~~
2.3 OpenCV的下载与编译
到OpenCV的主页上找到对应的版本2.4.9,下载Opencv for windows ,安装到自己的目录,比如D:\OpenCV;然后使用CMake工具编译基于CUDA和TBB的OpenCV库,这个过程可以参看,
http://www.cnblogs.com/freedomshe/archive/2013/01/11/win7_vs2012_opencv_rebuild.html
这篇文章写得很详细,而且图文并茂,很好懂,虽然这篇文章的OPENCV及vs版本不同,但是VS2010按照他的过程来编译也是可以顺利通过的;
需要的注意的是,
1) 在配置CMake的时候选择VS10 WIN64(根据自己的操作系统和VS版本选择); 勾选WITH_TBB,WITH_CUDA
2) 把debug和release两个版本都编译上;编译的时间比较长(视电脑性能,自己编译花了),耐心等待~~~
3)在编译过程中可能会弹出对话框 是否要 reload the solution when a CMakeLists.tx has changed, 这个可能是个bug,是CMake的宏造成的,所以可以再编译前检查一下是否有这样额的宏,VS2010中 (Tools)工具--》(Macros)宏--》(Macro explorer)宏查看器-》CMakeVSMacros2(也可能是其他的目录)找到 Public Sub ReloadProjects(Optional ByVal projects As String = "") 与Public Sub StopBuild(Optional ByVal projects As String = "")这两个函数,它们应该是VB写的,把函数体注释掉就可以了;
2.4 测试是否安装成功
安装完成后,新建一个WIN32项目,注意配置一下使用x64选项进行编译;如果安装成功 int devNum=cv::gpu::getCudaEnabledDeviceCount();将返回非0值,否则说明配置为成功。
#include "stdafx.h"
#include
#include "opencv2/opencv.hpp"
#include "opencv2/gpu/gpu.hpp"
int _tmain(int argc, _TCHAR* argv[])
{
int devNum=cv::gpu::getCudaEnabledDeviceCount();
try
{
cv::Mat src_host = cv::imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::gpu::GpuMat dst, src;
src.upload(src_host);
cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
cv::Mat result_host;
dst.download(result_host);
cv::namedWindow("Result",1);
cv::imshow("Result", result_host);
cv::waitKey();
}
catch(const cv::Exception& ex)
{
std::cout << "Error: " << ex.what() << std::endl;
}
return 0;
}
参考文献
【1】 http://www.cnblogs.com/freedomshe/archive/2013/01/11/win7_vs2012_opencv_rebuild.html
【2】http://blog.csdn.net/kelvin_yan/article/details/38866795
按语:首先感谢http://blog.csdn.net/fengbingchun/article/details/9831837这个博主的原创方法,在这个基础上编译之后发现了很多问题,所以进行了改正,有了以下方法:
重新编译OpenCV
1、 查看本机配置,查看显卡类型是否支持NVIDIA GPU,本机显卡为NVIDIA GeForce GT630;
2、 从http://www.nvidia.cn/Download/index.aspx?lang=cn下载最新驱动并安装;
3、 从https://developer.nvidia.com/cuda-toolkit根据本机类型下载相应最新版的CUDA Toolkit6.0 64位,安装,并通过样本程序验证其安装正确;
4、 将C:\ProgramFiles\NVIDIAGPU Computing Toolkit\CUDA\v6.0\bin添加到环境变量中(检查是否已经默认添加);
5、 从http://threadingbuildingblocks.org/下载最新版的TBB4.2,解压缩,并将其bin目录D:\soft\OpenCV2.4.8\TBB\tbb41_20140122oss\bin\ia64\vc10添加到环境变量中,注销或重启;
6、 从http://opencv.org/downloads.html 下载最新版本的OpenCV2.4.6,并解压缩到D:\soft\OpenCV2.4.8文件夹中;
7、 从http://www.cmake.org/cmake/resources/software.html下载最新版本的CMake2.8.11.2并安装;
8、打开CMake,在Where isthesource code:中选择D:\soft\OpenCV2.4.6\opencv文件夹,在Where to buildthe binaries:中选择D:/soft/OpenCV2.4.6/vs2010_GPU文件夹,此文件夹为手动创建;
9、点击Configure按钮,在弹出的对话框中选择VisualStudio 10,然后点击Finish;
10、 如果有红色框出现,勾选BUILD_EXAMPLES、WITH_TBB、WITH_CUBLAS、WITH_CUDA、WITH_CUFFT,然后再次点击Configure按钮;
11、如果还有红色框出现,TBB_INCLUDE_DIRS,将其值改为D:\soft\OpenCV2.4.6\TBB\tbb41_20130613oss\include为TBB中include所在的目录,然后再次点击Configure按钮;
12、 如何还有红色框出现,TBB_LIB_DIR、TBB_STDDEF_PATH,再次点击Configure按钮;
13、如果在下方信息框中有:Use TBB: YES(ver 4.1 interface 6105),Use Cuda: YES(ver5.0),证明我们已经将inteltbb和CUDA正确配置;
14、点击Generate按钮,此时会在D:\soft\OpenCV2.4.6\vs2010_GPU文件夹下生成OpenCV.sln文件;
15、以管理员身份,使用vs2010打开OpenCV.sln文件,选择View--> Properties Manager-->分别选中ALL_BUILD中的Debug和Release上的Microsoft.Cpp.Win64.user,依次添加inteltbb和CUDA 的Executable Directories、IncludeDirectories和Library Directories,点击右键-->Properties:
(需要说明的是:opencv里面要选择build文件夹下面的路径才对)
VC++ Directories,IncludeDirectories:
D:\soft\OpenCV2.4.6\TBB\tbb41_20130613oss\include
C:\Program Files\NVIDIAGPU ComputingToolkit\CUDA\v5.0\include
D:\opencv\build\include
D:\opencv\build\include\opencv
D:\opencv\build\include\opencv2
Library Directories:
D:\soft\OpenCV2.4.6\TBB\tbb41_20130613oss\lib\ia64\vc10
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\Win64
D:\opencv\build\x64\vc10\lib
Executable Directories:
D:\soft\OpenCV2.4.6\TBB\tbb41_20130613oss\bin\ia64\vc10
C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v5.0\bin
D:\opencv\build\x64\vc10\bin
16、选中modules中的opencv_gpu,点击右键,选择Properties-->Linker-->Input-->IgnoreSpecificDefault Libraries加入libcmtlibcmtd;(可忽视这条)
17、 分别在Debug和Release下,选择SolutionExplorer里的Solution OpenCV,点击右键,运行”Rebuild Solution”。(这个过程比较漫长,win7 64位,4GB内存,大概需要3小时)
18、点击CMakeTargets下的INSTALL—右键—仅本工程build,之后会在D:\soft\OpenCV2.4.3\vs2010\install文件夹下的bin文件夹中存放相应的动态库,在lib文件夹下存放相应的静态库;
补充说明
(1)、安装CUDA Toolkit时最好不要修改其默认的安装目录;
(2)、第17步的重建过程中,如果出现了很异常诡异的行为,有一种调试方式是删除原先配置的文件夹,重新cmake,清空VS2010里面的工程,重新编译,可能会改善。
(3)、为了缩短编译时间,可以通过CMake中改变CUDA_ARCH_BIN、CUDA_ARCH_PTX值进行设置,将BUILD_EXAMPLES的勾选去掉(没有这么做,因为是为了全部编译)
(4)、在编译前最好把360安全卫士和杀毒软件关闭;
(5)、也可不用管理员身份打开OpenCV.sln,第15步的属性配置在不同的电脑上有的必须的,有的可以不需要,最好都加上,免得返工;
(6)、也可以不用修改opencv_gpu模块的属性配置,默认即可,即第16步也不是必须的;
(7)、编译过程中会弹出数次对话框,如出现宏对话框则点击Cancel选项,其它则选择Yes选项;
(8)、编译成功后的库也可以直接应用于OpenCV中的OpenCL模块。
Debug过程
编译错误解决:
1、无法加载宏: C:/Users/XXX/Documents/Visual Studio 2010Projects/VSMacros80/ Samples/ Samples.vsmacros
解决方法:
把这个附件放在上述目录里面:附件
2、错误:
CMakeFiles/example_gpu_driver_api_multi.dir/driver_api_multi.cpp.o: Infunction `destroyContexts()':
driver_api_multi.cpp:(.text._Z15destroyContextsv+0xc): undefined referenceto `cuCtxDestroy_v2'
driver_api_multi.cpp:(.text._Z15destroyContextsv+0x1c): undefinedreference to `cuCtxDestroy_v2'
CMakeFiles/example_gpu_driver_api_multi.dir/driver_api_multi.cpp.o: Infunction `Worker::operator()(int) const':
driver_api_multi.cpp:(.text._ZNK6WorkerclEi+0x19): undefined reference to`cuCtxPushCurrent_v2'
driver_api_multi.cpp:(.text._ZNK6WorkerclEi+0x6bf): undefined reference to`cuCtxPopCurrent_v2'
解决方法:
Only two example will affect by this bug,"example_gpu_driver_api_multi" and"example_gpu_driver_api_stereo_multi"
Modify line 39
target_link_libraries(${the_target} ${OPENCV_LINKER_LIBS}${OPENCV_GPU_SAMPLES_REQUIRED_DEPS})
to
target_link_libraries(${the_target} ${OPENCV_LINKER_LIBS}${OPENCV_GPU_SAMPLES_REQUIRED_DEPS} cuda)
in "opencv-2.4.6.1/samples/gpu/CMakeLists.txt" can easily fixthis problem
3、错误:dllmain重复定义,opencv_world246.dll不存在等错误
解决方法:cmake的时候不要勾选build_world选项,这个重建也不是必须的
4、错误37374error LNK1104:无法打开文件“..\..\lib\Debug\opencv_superres248d.lib”D:\opencv\opencv248GPU\modules\superres\LINKopencv_test_superres
分析:是链接库链接不上造成的,添上这些库就可以了。
解决办法:第15步中务必把opencv的include\bin\lib目标都加进去,而且是build目录下的,如果还有问题,那么重新cmake,或者清除VS2010的缓存就可以了。
5、错误
Unable to cast COM object of type'System.__ComObject' to interface type 'EnvDTE.DTE'.
解决办法:可能是这个或者可以放在这里不解决,继续编译可以没有问题
http://blogs.msdn.com/b/smondal/archive/2012/10/02/unable-to-cast-com-object-of-type-system-comobject-to-interface-type-microsoft-visualstudio-ole-interop-iserviceprovider.aspx
The exception seems to indicate the crashwas caused due to an interface not being found. This indicates thatsomething's wrong with proxy/stubs on the machine. At leastIServiceProvider is failing. IE is usually the owner of the IServiceProviderproxy.
From the dump, it showed devenv.exe process crashed shortly afterloading: C:\Windows\SysWOW64\actxprxy.dll andC:\Windows\System32\mssprxy.dll
The issue turned out to be brokenregistration for IServiceProvider. The proxy-stub CLSID was wrong (it wasreferring to actxprxy.dll instead of ieproxy.dll on Windows 7 x64). Registeringieproxy.dll from an elevated cmd prompt resolved the issue. regsvr32 "C:\Program Files (x86)\Internet Explorer\ieproxy.dll"
On x86 systems, regsvr32"C:\Program Files\Internet Explorer\ieproxy.dll"
新编译的opencv使用方法
1、打开vs2010,新建一个控制台应用程序,为vs2010配置OpenCV环境:选择View-->Properties Manager-->分别选中Debug和Release上的Microsoft.Cpp.Win64.user,点击右键-->Properties:VC++ Directories,Include Directories:D:\Soft\OpenCV2.4.6\vs2010_GPU\install\include;D:\Soft\OpenCV2.4.6\vs2010_GPU\install\include\opencv;D:\Soft\OpenCV2.4.6\vs2010_GPU\install\include\opencv2;Library Directories:D:\Soft\OpenCV2.4.6\vs2010_GPU\install\lib;
2、选中工程-->Properties-->Configuration Properties-->Linker-->Input-->AdditionalDependencies:Debug和Release,添加相应的.lib库;
3、将D:\soft\OpenCV2.4.6\vs2010_GPU\install\bin加入到windows系统环境变量Path中,重启。(也可以将install文件夹全部拷贝出来,作为一个新的opencv版本存在,里面应该包括include\bin\lib这个几个主要目录)
4、示例如下,如果iDevicesNum结果非0,说明安装配置正确。
1. #include "stdafx.h"
2. #include <opencv2/opencv.hpp>
3. #include <opencv2/gpu/gpu.hpp>
4.
5. using namespace cv;
6. using namespace cv::gpu;
7.
8. int_tmain(int argc, _TCHAR* argv[])
9. {
10. int iDevicesNum = getCudaEnabledDeviceCount();
11.
12. cout<<iDevicesNum<<endl;
13.
14. return 0;
15.}
参考文献
1、 http://opencv.willowgarage.com/wiki/OpenCV_GPU
2、 http://docs.opencv.org/modules/gpu/doc/introduction.html
3、 http://wenku.baidu.com/view/81e29c6f011ca300a6c390dd.html
4、 http://blog.cuvilib.com/2011/03/22/how-to-build-opencv-2-2-with-gpu-cuda-on-windows-7/
5、 http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-microsoft-windows/index.html
【计算机视觉】关于OpenCV中GPU配置编译的相关事项的更多相关文章
- 【计算机视觉】OpenCV之GPU与OpenCL的相关内容说明
1 扩展库简介OpenCV(Open Source Computer Vision Library)是一个致力于实时处理计算机视觉问题的开源库.它最初由Intel公司开发,以GPL许可协议发布,后来由 ...
- 【计算机视觉】【并行计算与CUDA开发】OpenCV中GPU模块使用
CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行:2.传输数据到GPU:3.确定grid,block大小: 4.调用内核 ...
- 【OpenCV】OpenCV中GPU模块使用
CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行:2.传输数据到GPU:3.确定grid,block大小: 4.调用内核 ...
- 【OpenCV】OpenCV中GPU模块使用 (转)
CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行:2.传输数据到GPU:3.确定grid,block大小: 4.调用内核 ...
- OpenCV中GPU模块使用
CUDA IT168的文章系列: Cuda的初始化:http://tech.it168.com/a2011/0715/1218/000001218458.shtml OpenCV: OpenCV中GP ...
- 【计算机视觉】Opencv中的Face Detection using Haar Cascades
[计算机视觉]Opencv中的Face Detection using Haar Cascades 标签(空格分隔): [图像处理] 声明:引用请注明出处http://blog.csdn.net/lg ...
- OpenCV学习笔记一:OpenCV概览与配置编译
一,OpenCV OpenCV官方网站:http://opencv.org/ OpenCV目前最新代码库地址:https://github.com/itseez/opencv 二,简介: OpenC ...
- Android studio 中的配置编译错误总结
1.编译Andorid 工程的时候,有时候出现gradle 报下面的错误. Error:(1, 0) Cause: com/android/build/gradle/LibraryPlugin : U ...
- OpenCV中GPU函数
The OpenCV GPU module is a set of classes and functions to utilize GPU computational capabilities. I ...
随机推荐
- C# 安全性
一.标识和Principal static void Main(string[] args) { AppDomain.CurrentDomain.SetPrincipalPolicy(System.S ...
- 冒泡排序之javascript
冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字 ...
- keydown([[data],fn]) 当键盘或按钮被按下时,发生 keydown 事件。
keydown([[data],fn]) 概述 当键盘或按钮被按下时,发生 keydown 事件. 注释:如果在文档元素上进行设置,则无论元素是否获得焦点,该事件都会发生.直线电机滑台 参数 fnFu ...
- request.getParameter乱码
String str= new String(request.getParameter("xxxx").getBytes("ISO-8859-1")," ...
- MySQL5.7 (审计)安装audit审计插件
转载自:https://blog.51cto.com/13941177/2173086 注意: 安装插件的方式优缺点: 缺点:日志信息比较大,对性能影响大. 优点:对每一时刻每一用户的操作都有记录. ...
- redis数据存储--redis在Windows下的安装过程
一.下载软件 1. 下载Redis windows版本,Redis官网下载地址为:https://redis.io/download: 这里下载的是Windows版本,下载地址为:https://gi ...
- svn 外部引用别的项目文件
建立了一个文件目录E:\My\myproject 想在该目录下有一个文件夹引用别的工程的文件. 1.在E:\My\myproject 空白处右键属性. 2.点击Properties,弹出 3.点击ne ...
- 【概率论】2-2:独立事件(Independent Events)
title: [概率论]2-2:独立事件(Independent Events) categories: Mathematic Probability keywords: Independent Ev ...
- ECMAScript 5.0 基础语法(下)“稍微重点一点点”
接上篇 七.常用内置对象(复杂数据类型)(重点) (1)数组Array 创建:例 var colors = ['red','blue','green'] #推荐这样,因为简单粗暴 或:v ...
- 数据结构实验之数组二:稀疏矩阵(SDUT 3348)
Problem Description 对于一个n*n的稀疏矩阵M(1 <= n <= 1000),采用三元组顺序表存储表示,查找从键盘输入的某个非零数据是否在稀疏矩阵中,如果存在则输出O ...