首页 > 其他分享 >[转]OpenCV4.8 GPU版本CMake编译详细步骤 与CUDA代码演示

[转]OpenCV4.8 GPU版本CMake编译详细步骤 与CUDA代码演示

时间:2024-09-01 12:47:35浏览次数:13  
标签:CMake OpenCV4.8 编译 OpenCV result cv CUDA

导 读
本文将详细介绍如何使用CMake编译OpenCV4.8 CUDA版本并给出Demo演示,方便大家学习使用。

CMake编译详细步骤

废话不多说,直接进入正题!

【1】我使用的工具版本VS2017 + CMake3.18.2 + OpenCV4.8.0 + CUDA11.2

一般情况下VS版本≥VS2017均可,CMake版本≥3.18.2,OpenCV4.8.0目前最新,CUDA版本保持一致或更高。

【2】OpenCV源码下载与CUDA安装

首先下载OpenCV4.8.0源码和Contrib部分源码:

https://github.com/opencv/opencv
https://github.com/opencv/opencv_contrib

下载后解压到指定目录:

在opencv-4.8.0文件夹下新建一个build文件夹用于保存编译文件:

 

自己安装CUDA相关依赖项,包括CUDA和CUDNN:

 

【3】CMake配置选项设置

CMake配置选项设置需要注意的地方如下:

① 根据自己的VS版本选择编译什么版本,此处VS2017 64位

② 配置源码路径与生成文件路径:

 

③ 配置contrib源码目录:

 

④ CUDA路径不用配置,会自动识别并填入,还有下面几个需要勾选的选项记得勾选:

 

⑤ 其他需要勾选的选项:

 

【4】CMake Config与问题解决

正常步骤接下来就是点击Configure和Generate,就可以生成OpenCV.sln项目。但是经常会出警告或者错误,大部分是因为一些依赖文件下载失败导致的:

 

虽然是警告,但是一定要解决,否则在后面编译OpenCV.sln项目的时候还是会失败!

解决方法:按照提示,打开对应的CMakeDownloadLog.txt,然后把对应的文件下载下来放到指定目录,里面都有写,如下图所示:

 

文件下载成功且匹配会有下面对应的提示:

 

文件下载成功后,再点击Configure就不会有红色警告提示了。然后点击Generate,生成OpenCV.sln项目。

 

【5】VS编译生成依赖项

打开OpenCV.sln,编译INSTALL,然后右键仅用于项目--仅生成INSTALL

 

下面是生成后的文件,opencv_world480.dll文件1.06G正常:

 

OpenCV CUDA编程实例

当使用C++ OpenCV和CUDA编写代码时,一般的步骤如下:

【1】包含必要的头文件:首先,包含相关的头文件,以便使用OpenCV和CUDA库。​​​​​​​

#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>

【2】加载图像或视频:使用OpenCV的函数加载输入图像或视频。例如,可以使用cv::imread()加载图像或cv::VideoCapture加载视频。​​​​​​​

cv::Mat image = cv::imread("image.jpg");
// 或者
cv::VideoCapture video("video.mp4");

【3】分配GPU内存并将数据复制到设备内存:如果计划在CUDA上执行加速操作,则需要在GPU上为图像或视频分配内存,并将数据从主机内存复制到设备内存。​​​​​​​

cv::cuda::GpuMat gpuImage;
gpuImage.upload(image);
// 或者
cv::cuda::GpuMat gpuVideo;
cv::Mat frame;
video.read(frame);
gpuVideo.upload(frame);

【4】执行CUDA加速操作:调用适当的OpenCV CUDA函数,在GPU上执行CUDA加速操作。​​​​​​​

cv::cuda::cvtColor(gpuImage, gpuImage, cv::COLOR_BGR2GRAY);
// 或者
cv::cuda::blur(gpuVideo, gpuVideo, cv::Size(3, 3));

【5】将结果从设备内存复制到主机内存:使用download()方法将结果从设备内存复制到主机内存。​​​​​​​

cv::Mat result;
gpuImage.download(result);
// 或者
cv::cuda::GpuMat result;
cv::cuda::bitwise_not(gpuImage, result);
cv::Mat result_host;
result.download(result_host);

【6】显示结果:使用OpenCV的函数在屏幕上显示结果图像或视频帧。​​​​​​​

cv::imshow("Result", result);
cv::waitKey(0);
cv::destroyAllWindows();

这些是一般的步骤,具体的代码实现和操作可能会根据需要有所不同。请确保安装和配置了正确版本的OpenCV和CUDA,并根据您的需求进行适当的调整。

至于加速效果还要根据实际情况分析,下面是官方给的个别方法加速对比:
————————————————

本文为Color Space原创,未经允许禁止转载!
原文链接:https://blog.csdn.net/stq054188/article/details/132766965

 

标签:CMake,OpenCV4.8,编译,OpenCV,result,cv,CUDA
From: https://www.cnblogs.com/rainbow70626/p/18391193

相关文章

  • CUDA教程之 10 掌握 CUDA 矩阵乘法:共享内存、Tile 内存合并和 Bank 冲突简介(教程含源
    介绍在使用CUDA进行GPU编程的世界中,优化性能是关键。实现此目标的最强大技术之一是使用共享内存。本博客将引导您完成使用共享内存执行矩阵乘法的CUDA程序,特别关注理解分块内存合并和存储体冲突。在本文结束时,您将牢固掌握共享内存如何显著加快您的计算速度以及如何......
  • 深入解析:如何在复杂 C++ 项目中高效集成 CMake 和 Conan
    目录标题第一章:C++项目中的Conan和CMake基础架构1.1项目架构概述1.2CMake与Conan的基本角色1.2.1CMake的角色1.2.2Conan的角色1.3在项目中合理结合使用CMake和Conan1.4实例分析1.5结语第二章:C++项目中的CMake和Conan实践2.1项目结构概览......
  • 【c++实用】CMakeLists 基本用法(一)
    指令解释cmake_minimum_required(VERSION3.24):指令指定了所需的最低CMake版本a.作用:确保在执行CMake配置时,使用的CMake版本不低于3.24。如果安装的CMake版本低于指定的版本,CMake将会输出错误信息,并拒绝继续执行后续命令b.兼容性:有助于确保项目构建脚......
  • CMake构建学习笔记12-libzip库的构建
    如果要更方便地压缩/解压缩文件或者文件夹,除了使用基于zlib的minizip库,更推荐使用另一个基于zlib的库libzip,个人认为其接口设计更科学一点,文档也更丰富一点。不过libzip库本身的构建倒是没什么特别的,关键指令如下所示:#配置CMakecmake..-G"$Generator"-Ax64`-DCMAK......
  • CMake构建学习笔记11-minizip库的构建
    准确来说,minizip其实是zlib提供的辅助工具,位于zlib库的contrib文件夹内。minizip提供了更为高级一点的接口,能直接操作文件进行压缩。不过,有点麻烦的是这个工具并没有提供CMake构建的方式。那么可以按照构建giflib的方式,自己组织CMakeList.txt,正好这个项目的代码量并不多。另一个......
  • CMake构建学习笔记11-minizip库的构建
    准确来说,minizip其实是zlib提供的辅助工具,位于zlib库的contrib文件夹内。minizip提供了更为高级一点的接口,能直接操作文件进行压缩。不过,有点麻烦的是这个工具并没有提供CMake构建的方式。那么可以按照构建giflib的方式,自己组织CMakeList.txt,正好这个项目的代码量并不多。另一个......
  • 编写CUDA核函数验与证核函数杂谈
    编写核函数核函数也是一个函数,但是声明核函数有一个比较模板化的方法:global__voidkernel_name(argumentlist);注意:声明和定义是不同的,这点CUDA与C语言是一致的在C语言函数前没有的限定符global,CUDAC中还有一些其他在C中没有的限定符,见表10-2。表10-2CUDAC中一些其他在C......
  • 错误处理、cuda模型、GPU架构杂谈
    错误处理、cuda模型、GPU架构杂谈错误处理所有编程都需要对错误进行处理,早起的编码错误,编译器会帮搞定,内存错误也能观察出来,但是有些逻辑错误很难发现,甚至到了上线运行时才会被发现,而且有些厉害的bug复现会很难,不总出现,但是很致命,而且CUDA基本都是异步执行的,当错误出现的时候,不......
  • CUDA编程结构、存储管理、线程管理杂谈
    CUDA编程结构、存储管理、线程管理杂谈CUDA编程结构一个异构环境,通常有多个CPU多个GPU,他们都通过PCIe总线相互通信,也是通过PCIe总线分隔开的。所以要区分一下两种设备的内存:1)主机:CPU及其内存2)设备:GPU及其内存这两个内存从硬件到软件都是隔离的(CUDA6.0以后支持统一寻址),目前先......
  • CMake构建学习笔记10-OsgQt库的构建
    笔者使用的OsgQt库是Github上openscenegraph仓库中托管的项目(地址),该库的功能是将Osg嵌入到Qt窗体中。不过该库的使用总是有点问题,具体的介绍笔者在之前的两篇博文中论述过:OSG嵌入QT的简明总结OSG嵌入QT的简明总结2因此,这里笔者还是将这个库分成了两个版本进行构建。构建topic/Q......