若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/161454678
长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…
OpenCV开发专栏(点击传送门)
上一篇:《OpenCV开发笔记(八十三):图像remap实现哈哈镜效果》 下一篇:持续补充中…
前言
使用windows上的支持gtx5050显卡cuda的opencv编译。
关于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则是针对硬件的应用程序开发接口,它能给程序员更多对硬件的控制权,相应的上手及开发会比较难一些。 
编译过程(失败流程,原因:互相兼容失败)
步骤一:安装VS2019
略
步骤二:安装cuda12.8
略
步骤三:CMake配置
配置路径和生成文件夹: 
配置编译器,使用msvc2017,x64(x64要选择,默认32位): 
开始配置,等待: 

第一次配置完,证明标准流程可以配置跑通: 
步骤四:CMake配置cuda

然后再点一次“configure”: 
步骤五:添加扩展模块opencv_contrib

再配置: 
步骤六:generate生成vs工程

步骤七:打开工程编译

开始编译,先测试opencv主模块core:
可以放心大胆的编译了。
步骤八:生成debug和release



大概需要2-3个小时左右
步骤九:install输出

编译过程(失败流程,原因:互相兼容失败)
步骤一:安装VS2017
略
步骤二:安装cuda13.2
略
步骤三:CMake配置
配置路径和生成文件夹: 
配置编译器,使用msvc2017,x64(x64要选择,默认32位): 
开始配置,等待: 
这个地方常规就会卡卡ffmpeg,果然: 
抠出网址,自己web下载,双并行cmake会下载快一些或者不卡住,如果卡住就看日志直接放入他得缓存目录即可。 上面是32位得顺利通过可以,但是64位得需要多配置2个,查看“入坑一”:
第一次配置完,证明标准流程可以配置跑通: 
步骤四:CMake配置cuda

然后再点一次“configure”: 

这时候检查cuda,搜索cuda即可: 
发现cuda已经自动添加进去,进一步确认位置: 
(应该大概率事因为,装cuda得时候带进去了环境变量?)
步骤五:添加扩展模块opencv_contrib3.4.0



步骤六:generate生成vs工程


步骤七:打开工程编译

开始编译,编译报错:
这里后续怎么弄都是编码代码错误,于是考虑是版本兼容性问题,也确认是这个问题导致代码变动从而出现未定义。所以这条路走不通了。
Qt模块化(OpenCVGpuManager)
部署环境
涉及到gpu跟cuda、qt、编译环境息息相关,如下:
- 显卡:NVIDIA GeForce GTX 5050
- Cuda版本:12.8
- VS版本:2019×64
- Qt版本:5.14.2 msvc2019x64(将msvc2017x64克隆配上msvc2019x64编译器)
模块化部署

openCVGpuManager.pri
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
HEADERS += \\
$$PWD/OpencvGPUManager.h
SOURCES += \\
$$PWD/OpencvGPUManager.cpp
# 包含opencv
INCLUDEPATH += $$PWD/rtx5050_cuda12.9_msvc2019x64_install/include
INCLUDEPATH += $$PWD/rtx5050_cuda12.9_msvc2019x64_install/include/opencv2
LIBS += –L$$PWD/rtx5050_cuda12.9_msvc2019x64_install/x64/vc16/lib
LIBS += –lopencv_xphoto4100
LIBS += –lopencv_aruco4100
LIBS += –lopencv_bgsegm4100
LIBS += –lopencv_bioinspired4100
LIBS += –lopencv_calib3d4100
LIBS += –lopencv_ccalib4100
LIBS += –lopencv_core4100
LIBS += –lopencv_cudaarithm4100
LIBS += –lopencv_cudabgsegm4100
LIBS += –lopencv_cudacodec4100
LIBS += –lopencv_cudafeatures2d4100
LIBS += –lopencv_cudafilters4100
LIBS += –lopencv_cudaimgproc4100
LIBS += –lopencv_cudalegacy4100
LIBS += –lopencv_cudaobjdetect4100
LIBS += –lopencv_cudaoptflow4100
LIBS += –lopencv_cudastereo4100
LIBS += –lopencv_cudawarping4100
LIBS += –lopencv_cudev4100
LIBS += –lopencv_datasets4100
LIBS += –lopencv_dpm4100
LIBS += –lopencv_face4100
LIBS += –lopencv_features2d4100
LIBS += –lopencv_flann4100
LIBS += –lopencv_fuzzy4100
LIBS += –lopencv_gapi4100
LIBS += –lopencv_hfs4100
LIBS += –lopencv_highgui4100
LIBS += –lopencv_img_hash4100
LIBS += –lopencv_imgcodecs4100
LIBS += –lopencv_imgproc4100
LIBS += –lopencv_intensity_transform4100
LIBS += –lopencv_line_descriptor4100
LIBS += –lopencv_ml4100
LIBS += –lopencv_objdetect4100
LIBS += –lopencv_optflow4100
LIBS += –lopencv_phase_unwrapping4100
LIBS += –lopencv_photo4100
LIBS += –lopencv_plot4100
LIBS += –lopencv_quality4100
LIBS += –lopencv_rapid4100
LIBS += –lopencv_reg4100
LIBS += –lopencv_rgbd4100
LIBS += –lopencv_saliency4100
LIBS += –lopencv_shape4100
LIBS += –lopencv_signal4100
LIBS += –lopencv_stereo4100
LIBS += –lopencv_stitching4100
LIBS += –lopencv_structured_light4100
LIBS += –lopencv_superres4100
LIBS += –lopencv_surface_matching4100
LIBS += –lopencv_tracking4100
LIBS += –lopencv_video4100
LIBS += –lopencv_videoio4100
LIBS += –lopencv_videostab4100
LIBS += –lopencv_xfeatures2d4100
LIBS += –lopencv_ximgproc4100
LIBS += –lopencv_xobjdetect4100
工程模板OpenCVGpuDemo v1.0.0

入坑一
入坑一:64位编译报错
问题
32位配置通过,改64位后失败:
(补充:版本兼容问题,就算配置通过,后续编译也会出现代码编译错误)。
定位
就看到一个配置错误: 
这是在检测cuda支持的架构时未能获取到有效值,导致列表为空,因此我们需要手动设定cuda架构。 确认是否安装nvcc: 
配置构架: 
Windows使用命令行:
nvcc –help
找到支持得: 
当前的显卡: 
测试也不行。 直接更新到cmake3最新得版本:

解决
最是版本问题,互相限制不兼容导致的,下面是兼容后的: 
上一篇:《OpenCV开发笔记(八十三):图像remap实现哈哈镜效果》 下一篇:持续补充中…
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/161454678

