zoukankan      html  css  js  c++  java
  • 【计算机视觉】关于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
  • 相关阅读:
    Kubernetes中部署MySQL
    内置函数-format()
    Jenkins-deploymnt
    一次遇到too many open files的解决详情
    一次nginx问题记录
    kickstart自动化安装系统
    Maven —— 命令行清除编译打包
    CURL 发送POST请求
    mysql的my.cnf配置参考
    利用nginx实现生产和灰度环境流量切换
  • 原文地址:https://www.cnblogs.com/huty/p/8517651.html
Copyright © 2011-2022 走看看