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

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/102793581

目录

前言

背景

关于OpenCL硬件加速与Cuda

OpenCL

CUDA

OpenCL与CUDA区别

OpenCV编译支持Gpu(window qt msvc2015)

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

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

步骤三:生成工程

步骤四:使用VS2017编译

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

重装系统重新开始OpenCV编译

步骤一:安装VS2015社区版本

步骤二:安装cuda9.0

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

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

步骤五:添加opencv_contrib3.4.0

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

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

步骤八:生成debug和release

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

Qt模块化(OpenCVGpuManager)

部署环境

模块化部署

openCVGpuManager.pri

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


OpenCV开发专栏

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

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

OpenCV开发笔记(二):cvui交互界面

OpenCV开发笔记(三):OpenCV图像的概念和基本操作

OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储

OpenCV开发笔记(五):OpenCV读取与操作摄像头

OpenCV开发笔记(六):OpenCV基础数据结构、颜色转换函数和颜色空间

OpenCV开发笔记(七):OpenCV基础图形绘制

OpenCV开发笔记(八):OpenCV常用操作之计时、缩放、旋转、镜像

OpenCV开发笔记(九):OpenCV区域图像(ROI)和整体、局部图像混合

OpenCV开发笔记十):OpenCV图像颜色通道分离和图像颜色多通道混合

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

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

持续补充中…

 

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

前言

       接上一篇章,使用cuda开发,cuda不支持windows下的mingw开发,所以转为msvc2015 32。

 

背景

       上一篇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

 

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/102793581

发布了227 篇原创文章 · 获赞 237 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/qq21497936/article/details/102793581