【计算机视觉】关于OpenCV中GPU配置编译的相关事项

【计算机视觉】关于OpenCV中GPU配置编译的相关事项

标签(空格分隔): 【计算机视觉】


前一段发现了OpenCV中关于GPU以及opencl的相关知识,打算升级一下对OpenCV的使用,但是发现从OpenCV官网上下载的都是没有WITH_CUDA这一选项的。于是必须进行OpenCV带CUDA的重编译!下面就记录这一阶段出现的一系列问题。


  1. 关于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版本都生成成功了,这全部是最新版本的相互之间的匹配。
  1. 关于CMAKE的配置选项
    一个是要选择WITH_CUDA,然后是选择capabilities,我的笔记本是GTX860M对应的为5.0,我查了一下后面要部署的显卡GTX1060为6.1,我把这两项加了进去,其实还有一个GPU架构的选项,好像不选的话就是对应自动,但是里面还好像只有开普勒和费米架构?我配置成功的这次没有选择。另外,好像用10版本的配置这个能力的时候居然配置不成功,不知道啥原因。

  1. 关于我电脑上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的这个版本。保留工程文件!

  2. 下面是一些引文参考:

近期由于课题需要使用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.html2】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:ProgramFilesNVIDIAGPU Computing ToolkitCUDAv6.0in添加到环境变量中(检查是否已经默认添加);

5、 从http://threadingbuildingblocks.org/下载最新版的TBB4.2,解压缩,并将其bin目录D:softOpenCV2.4.8TBB	bb41_20140122ossinia64vc10添加到环境变量中,注销或重启;

6、 从http://opencv.org/downloads.html 下载最新版本的OpenCV2.4.6,并解压缩到D:softOpenCV2.4.8文件夹中;

7、 从http://www.cmake.org/cmake/resources/software.html下载最新版本的CMake2.8.11.2并安装;

8、打开CMake,在Where isthesource code:中选择D:softOpenCV2.4.6opencv文件夹,在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:softOpenCV2.4.6TBB	bb41_20130613ossinclude为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:softOpenCV2.4.6vs2010_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:softOpenCV2.4.6TBB	bb41_20130613ossinclude 

C:Program FilesNVIDIAGPU ComputingToolkitCUDAv5.0include

D:opencvuildinclude

D:opencvuildincludeopencv

D:opencvuildincludeopencv2



Library Directories:

D:softOpenCV2.4.6TBB	bb41_20130613osslibia64vc10 

C:Program FilesNVIDIA GPU Computing ToolkitCUDAv5.0libWin64

D:opencvuildx64vc10lib



Executable Directories:

D:softOpenCV2.4.6TBB	bb41_20130613ossinia64vc10  

C:Program FilesNVIDIA GPU ComputingToolkitCUDAv5.0in

D:opencvuildx64vc10in



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:softOpenCV2.4.3vs2010install文件夹下的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:无法打开文件“....libDebugopencv_superres248d.lib”D:opencvopencv248GPUmodulessuperresLINKopencv_test_superres
分析:是链接库链接不上造成的,添上这些库就可以了。

解决办法:第15步中务必把opencv的includeinlib目标都加进去,而且是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:WindowsSysWOW64actxprxy.dll andC:WindowsSystem32mssprxy.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 Explorerieproxy.dll" 

On x86 systems,  regsvr32"C:Program FilesInternet Explorerieproxy.dll"





新编译的opencv使用方法

1、打开vs2010,新建一个控制台应用程序,为vs2010配置OpenCV环境:选择View-->Properties Manager-->分别选中Debug和Release上的Microsoft.Cpp.Win64.user,点击右键-->Properties:VC++ Directories,Include Directories:D:SoftOpenCV2.4.6vs2010_GPUinstallinclude;D:SoftOpenCV2.4.6vs2010_GPUinstallincludeopencv;D:SoftOpenCV2.4.6vs2010_GPUinstallincludeopencv2;Library Directories:D:SoftOpenCV2.4.6vs2010_GPUinstalllib;

2、选中工程-->Properties-->Configuration Properties-->Linker-->Input-->AdditionalDependencies:Debug和Release,添加相应的.lib库;

3、将D:softOpenCV2.4.6vs2010_GPUinstallin加入到windows系统环境变量Path中,重启。(也可以将install文件夹全部拷贝出来,作为一个新的opencv版本存在,里面应该包括includeinlib这个几个主要目录)

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
原文地址:https://www.cnblogs.com/huty/p/8517651.html