OpenCV开发笔记(十二):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-msvc2015编译(opencv3.4.0、cuda9.0、VS2015)

若该文为原创文章,未经容许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:http://www.javashuo.com/article/p-wxwjppoc-mo.html
本文章博客地址:http://www.javashuo.com/article/p-vynlwpnh-nu.html
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么本身研究程序员

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门)编程

OpenCV开发专栏(点击传送门)

上一篇:OpenCV开发笔记(十一):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-mingw32编译windows

下一篇:OpenCV开发笔记(十三):OpenCV图像对比度、亮度的调整服务器

 

前言

       接上一篇章,使用cuda开发,cuda不支持windows下的mingw开发,因此转为msvc2015 32。架构

 

OpenCV编译相关博客

OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境app

OpenCV开发笔记(一):OpenCV介绍、编译ide

OpenCV开发笔记(十一):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-mingw32编译模块化

OpenCV开发笔记(十二):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-msvc2015编译(opencv3.4.0、cuda9.0、VS2015)工具

OpenCV开发笔记(三十四):红胖子带你傻瓜式编译Qt+openCV3.4.1+opencv_contrib(全网最浅显易懂)性能

OpenCV开发笔记(七十):红胖子带你傻瓜式编译VS2017x64版本的openCV4

 

背景

       上一篇OpenCV开发笔记(十一):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-mingw32编译》,cuda没法在windows平台上不支持mingw32

 

关于OpenCL硬件加速与Cuda

OpenCL

       由苹果(Apple)公司发起,业界众多著名厂商共同制做的面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境。便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,并且普遍适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其余并行处理器,在游戏、娱乐、科研、医疗等各类领域都有广阔的发展前景。

CUDA

       CUDA是一个基于Nvidia GPU的并行计算的架构。CUDA最主要的包含两个方面:一个是ISA指令集架构;第二硬件计算引擎;其实是硬件和指令集。 也就是说咱们能够把CUDA看作是与X86或者cell相似的架构,可是是基因而GPU,而不是传统的CPU。

OpenCL与CUDA区别

       Cuda和OpenCL的关系并非冲突关系,而是包容关系

       OpenCL是一个API,在第一个级别,CUDA架构是更高一个级别,在这个架构上不论是OpenCL仍是DX11这样的API,仍是像C语言、Fortran、DX11计算,均可以支持。做为程序开发员来说,通常他们只懂这些语言或者API,能够采用多种语言开发本身的程序,无论他选择什么语言,只要是但愿调用GPU的计算能,在这个架构上均可以用CUDA来编程。

       关于OpenCL与CUDA之间的技术区别,主要体如今实现方法上。基于C语言的CUDA被包装成一种容易编写的代码,所以即便是不熟悉芯片构造的科研人员,也可能利用Cuda工具编写出实用的程序。OpenCL虽然句法上与CUDA接近,可是它更增强调底层操做,所以难度较高,但正由于如此,OpenCL才能跨平台运行。

       CUDA是一个并行计算的架构,包含有一个指令集架构和相应的硬件引擎。OpenCL是一个并行计算的应用程序编程接口(API),在NVIDIA CUDA架构上OpenCL是除了C for CUDA外新增的一个CUDA程序开发途径。

       若是你想得到更多的对硬件上的控制权的话,你可使用OpenCL这个API来进行编程,若是对API不是太了解,也能够用CUDA C语言来编程,这是两种不一样编程的方式,他们有他们相同点和不一样点

       OpenCL和CUDA C语言进行开发的时候,在并行计算这块,他们的概念是差很少的,这两种程序在程序上是有很大的类似度,因此程序之间的相互移植相对来讲也是比较容易。

       CUDA C是一种高级语言,那些对硬件了解很少的非专业人士也能轻松上手;而OpenCL则是针对硬件的应用程序开发接口,它能给程序员更多对硬件的控制权,相应的上手及开发会比较难一些。

 

OpenCV编译支持Gpu(window qt msvc2015)

步骤一:CMake配置,错误“error in configuration process, project……”IDE版本问题

       以上错误是没找到编译器,简单来讲就是,重载安装VS2017的相关部分(添加MSVC2015的编译C++环境)

       而后继续,发现VS2017和MSVC2015虽然都装了,可是CMake得和VS编译器配对,通过每个都测试,只能选择以下,才能够不报上述错误

       解决以下图(未装MSVC2015以前不行也没有再深究了),选择32位和64位又均可以编译经过了,推论应该主要是要安装下面这个:

       配置32位的,以下图:

步骤二:CMake配置,错误“error in configuration process, project…”环境变量问题

       查看错误文件“CMakeError.log”,以下图:

       须要设置的环境变量,查看报错的环境变量:

CUDA_cublas_LIBRARY (ADVANCED)
CUDA_cufft_LIBRARY (ADVANCED)
CUDA_nppc_LIBRARY (ADVANCED)
CUDA_nppial_LIBRARY (ADVANCED)
CUDA_nppicom_LIBRARY (ADVANCED)
CUDA_nppidei_LIBRARY (ADVANCED)
CUDA_nppif_LIBRARY (ADVANCED)
CUDA_nppig_LIBRARY (ADVANCED)
CUDA_nppim_LIBRARY (ADVANCED)
CUDA_nppist_LIBRARY (ADVANCED)
CUDA_nppisu_LIBRARY (ADVANCED)
CUDA_nppitc_LIBRARY (ADVANCED)
CUDA_npps_LIBRARY (ADVANCED)

       必需要设置,不然没法生成工程文件。

       查看是否有这些库,以下图:

       只有64位的才有,那就配置为VS2017 X64的,32位的就压根没有了,因此改成vs2017 x64的,以下图:

       应该是检测到,默认就勾选上了,安装目录修改下,编译完成后好拿库。

步骤三:生成工程

       生成成功,以下图:

步骤四:使用VS2017编译

       打开VS2017打开上述build目录的vs的all工程,打开后以下图:

       改目标为release x64编译工程,生成解决方案,漫长的等待。

根据经验,编译是编译全部的dll和例子,不少时候例子是会有错误的(须要调整环境变量,库的安装路径等等),因此这时候一个小技巧,退而求其次,单独编译opencv库就好了,试一试以下图:

分别以下图:

Opencv仍是错误,经判断应该是CMake使用版本问题,查询以下图:

       因此要查询下显卡支持的cuda的计算能力,网址:

https://developer.nvidia.com/cuda-gpus

       查询显卡计算能力,能够经过运行cuda samples中的deviceQuery得知。

       命令行运行结果以下图:

       修改CMake配置:

       从新configure和generate一次,仍是不行,各类查找,继续修改

       后通过屡次其余方法尝试,不在列举,都没法解决,基本上能尝试的方法都尝试了,遂决定下降cuda sdk的版本

步骤五:更换SDK版本(10.1--->9.0)

       下载旧版本的地址:https://docs.nvidia.com/cuda/

       这边下载,那边卸载已安装的,完成后继续CMake,VS走一遭

仍是错误

下降VS版本至VS2015。

 

重装系统从新开始OpenCV编译

步骤一:安装VS2015社区版本

步骤二:安装cuda9.0

步骤三:CMake配置,“MBuild.exe”的问题,须要装C++的通用开发环境和windows sdk。

       使用VS的安装工具,VS2015没有installer须要本身点开安装程序,自定义添加安装,安装完成后,配置经过,以下图:

步骤四:CMake配置,找不到一些dll的路径

查看本篇章OpenCV编译上重装系统前的步骤二,是配置编译环境要是64位的/

步骤五:添加opencv_contrib3.4.0

步骤六:配置报错,经过“SSL connect error”,警告不处理了,直接配置

步骤七:打开工程编译,成功编译opencv_core

步骤八:生成debug和release

       此时会出现错误,重定义什么的,实际上是test报错,非modules的库报错,最终在执行一次modules确认,以下图:

       (release整个工程编译大概2个多小时,网上有4个多小时的)。

       库编译成功,进行部署,而后拿取头文件和库文件,以下图:

步骤九:测试运行成功(参照模块化)

测试代码

bool OpenCVGpuManager::testOpenCVGpu()
{
    bool ret = false;
                             // 返回已安装的启用CUDA的设备数
    int deviceCount = cv::cuda::getCudaEnabledDeviceCount();
    if(deviceCount)
    {
        ret = true;
    }
    qDebug() << __FILE__ << __LINE__
             <<"The localMachine cuda‘s device count :" << deviceCount;
    return ret;
}

测试结果

 

Qt模块化(OpenCVGpuManager)

部署环境

       涉及到gpu跟cuda、qt、编译环境息息相关,以下:

  • 显卡:NVIDIA GeForce GTX 750
  • Cuda版本:9.0
  • VS版本:2015
  • Qt版本:5.9.3 msvc2015 x86_win64

模块化部署

openCVGpuManager.pri

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD

HEADERS += \
    $$PWD/OpenCVGpuManager.h

SOURCES += \
    $$PWD/OpenCVGpuManager.cpp

#must be msvc2015 64 (only for this platform

INCLUDEPATH += $${PWD}/openCVGpu3.4.0/include \
               $${PWD}/openCVGpu3.4.0/include/opencv \
               $${PWD}/openCVGpu3.4.0/include/opencv2

LIBS += -L$${PWD}/openCVGpu3.4.0/x64/vc14/lib
LIBS += -lopencv_aruco340
LIBS += -lopencv_bgsegm340
LIBS += -lopencv_bioinspired340
LIBS += -lopencv_calib3d340
LIBS += -lopencv_ccalib340
LIBS += -lopencv_core340
LIBS += -lopencv_cudaarithm340
LIBS += -lopencv_cudabgsegm340
LIBS += -lopencv_cudacodec340
LIBS += -lopencv_cudafeatures2d340
LIBS += -lopencv_cudafilters340
LIBS += -lopencv_cudaimgproc340
LIBS += -lopencv_cudalegacy340
LIBS += -lopencv_cudaobjdetect340
LIBS += -lopencv_cudaoptflow340
LIBS += -lopencv_cudastereo340
LIBS += -lopencv_cudawarping340
LIBS += -lopencv_cudev340
LIBS += -lopencv_datasets340
LIBS += -lopencv_dnn340
LIBS += -lopencv_dpm340
LIBS += -lopencv_face340
LIBS += -lopencv_features2d340
LIBS += -lopencv_flann340
LIBS += -lopencv_fuzzy340
LIBS += -lopencv_highgui340
LIBS += -lopencv_img_hash340
LIBS += -lopencv_imgcodecs340
LIBS += -lopencv_imgproc340
LIBS += -lopencv_line_descriptor340
LIBS += -lopencv_ml340
LIBS += -lopencv_objdetect340
LIBS += -lopencv_optflow340
LIBS += -lopencv_phase_unwrapping340
LIBS += -lopencv_photo340
LIBS += -lopencv_plot340
LIBS += -lopencv_reg340
LIBS += -lopencv_rgbd340
LIBS += -lopencv_saliency340
LIBS += -lopencv_shape340
LIBS += -lopencv_stereo340
LIBS += -lopencv_stitching340
LIBS += -lopencv_structured_light340
LIBS += -lopencv_superres340
LIBS += -lopencv_surface_matching340
LIBS += -lopencv_text340
LIBS += -lopencv_tracking340
LIBS += -lopencv_video340
LIBS += -lopencv_videoio340
LIBS += -lopencv_videostab340
LIBS += -lopencv_xfeatures2d340
LIBS += -lopencv_ximgproc340
LIBS += -lopencv_xobjdetect340
LIBS += -lopencv_xphoto340

win32{
    # copy openCVGpu3.4.0 release dll
    src_file = $$PWD/openCVGpu3.4.0/x64/vc14/bin/*
    dst_file = $$OUT_PWD

    src_file ~= s,/,\\,g
    dst_file ~= s,/,\\,g

    system(xcopy $$src_file $$dst_file /y /s/q/e)
}

 

工程模板OpenCVGpuDemo:对应版本号v1.0.0

       OpenCVGpu对应版本号v1.0.0

 

上一篇:OpenCV开发笔记(十一):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-mingw32编译

下一篇:OpenCV开发笔记(十三):OpenCV图像对比度、亮度的调整

 

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:http://www.javashuo.com/article/p-wxwjppoc-mo.html
本文章博客地址:http://www.javashuo.com/article/p-vynlwpnh-nu.html