OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。项目源码由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

  但在实际使用中,如果是对处理时间要求比较高的场景,使用OpenCV处理图片数据很难满足要求,不过OpenCV支持使用CUDA进行加速,不过支持CUDA加速的依赖包需要我们自行编译才可使用,因此在本次文章中,我们将演示如何使用OpenCV源码自行编译代码文件,来实现CUDA加速。

1. 环境准备

1.1 软件环境

  本次编译平台使用的是 Windows 11 系统,使用CMake-gui + VS2022进行源码编译,为了大家更好的复现该项目,此处罗列一下本文所使用的环境:

  • CUDA: 12.2, cudnn: 8.9.3
  • Cmake: 3.28.0
  • Visual Studio 2022

关于以上环境的安装,大家可以查看网上相关文档自行安装即可。

1. 2 源码下载

  接下来需要下载OpenCV源码,此处需要下载两个源码,分别是opencvopencv_contrib。下载链接为

opencv:
https://github.com/opencv/opencv/archive/4.8.0.zip
opencv_contrib:
https://github.com/opencv/opencv_contrib/tags

  不过在下载时要注意一点,就是要保证opencvopencv_contrib下载的版本要一致,此处我们下载的版本为:4.8.0。下载完成后,将两个文件解压到同一个文件夹中,如下图所示。

2. CMake编译项目

2.1 创建cmake项目

  打开CMake软件,设置项目源码路径,并在源码路径下创建一个build文件夹,并设置编译文件夹,如下图所示:

  接下来点击Configure,进行第一次配置,然后回弹出编译平台选择,此处根据自己电脑的编译软件进行选择,在本文中我们使用的是Visual Studio 2022,然后选择编译平台为x64

  第一次配置生成后,输出如下所示:

2.2 设置编译配置

  首先添加opencv_contrib模块的引用,在OPENCV_EXTRA_MODULES_PATH条目中添加该模块的路径,然后选择OPENCV_ENABLE_NONFREE,如下图所示:

  接下来添加CUDA的设置,首先选择WITH_CUDA,如下图所示:

  然后选择OPENCV_DNN_CUDA,此处还可以选择OPENCV_DNN_OPENVINO等不同的模型部署,如下图所示:

  最后选择ENABLE_FAST_MATH

  此处为了让生成的依赖库文件都集成在一个文件中,方便后面使用,所以此处可以选择BUILD_opencv_world,如果不选择,生成的 文件将会被拆散成多个文件。

  第二次Configure后,下一步就是需要检查一下其过程是否有异常抛出

2.3 解决异常

2.3.1 文件下载异常

  首先查看一下配置输出框是否抛出警告,如果有的话,一定要解决一下,不然后续编译会出错。

  当出现上图所示的异常后,就需要手动解决一下该问题,首先找到build\CMakeDownloadLog.txt文件,然后打开后,查看一下是否有下图所示的文件确实异常。如果有,请自行下载,下载链接如下图所示标注位置,下载后将文件放置在下图所示缺失文件路径,并按照要求修改名称。

2.3.2 解决CUDA版本异常

  该异常会在最后编译过程中出现,主要是当CUDA>=12.2时会出现该问题,因此需要检查一下自己的CUDA版本是否大于12.2.查看CUDA版本方式如下图所示。

  如果你的CUDA版本大于12.2,就要根据官方的要求进行修改,官方提供的解决方式链接为:cuda: fix for compatibility with CUDA Toolkit >= 12.2.0 by cudawarped · Pull Request #24104 · opencv/opencv (github.com)

其主要修改内容如下图所示。

2.4 编译项目

  解决完上述异常后,就可以进行项目编译了,点击Generate,就可以自动生成项目了。

3. Visual Studio 编译项目

  首先我们打开build\文件夹,可以看到生成的OpenCV.sln解决方案文件,使用Visual Studio打开该项目。

  然后运行ALL_BUILD项目即可,此处运行时间会比较长,尤其是再加入CUDA支持后,编译时间会更久。

  编译完成后,可以获得下面文件夹内容,此处主要是两个有用的文件夹,一个是install文件夹,这个文件夹主要是包含的时项目运行的依赖项,包括include/文件夹以及 .lib.dll等文件;第二个是python_loader文件夹,主要是python运行所需的依赖项。

4. 项目测试

  项目编译完成后,最后我们查看一下项目是否编译成功,此处使用cv2.cuda.getCudaEnabledDeviceCount()接口方法检查一下是否存在在线的CUDA设备,如果存在CUDA设备,将返回设备数量,如果没有,将返回0。如下图所示,在运行后,输出为1,本机设备只存在一个显卡,所以索命该项目已经编译好了。

5. 总结

  在本文中,我们实现了OpenCV源码编译,并结合本机安装的CUDA版本,实现了CUDA版本的OpenCV编译,并实现了Python API 以及C++ API 的使用。后续我们将会结合所编译的库进行项目开发以及与普通版本进行对比。

【OpenCV】 OpenCV 源码编译并实现 CUDA 加速 (Windows)的更多相关文章

  1. Ubuntu 17.04版本下,opencv进行源码编译安装

    本文主要针对Ubuntu 17.04版本下,opencv进行源码编译安装.开发环境主要针对python 对 openCV库的调用. 安装 gcc cmake 编译环境 sudo apt-get ins ...

  2. windows 10 上源码编译opengv | compile opengv on windows 10 from source

    本文首发于个人博客https://kezunlin.me/post/51cd9fa0/,欢迎阅读! compile opengv on windows 10 from source Series co ...

  3. tensorflow 源码编译tensorflow 1.1.0到 tensorflow 2.0,ver:1.1.0rc1、1.4.0rc1、1.14.0-rc1、2.0.0b1

    目录 tensorflow-build table 更多详细过程信息及下载: tensorflow-build tensorflow 源码编译,提升硬件加速,支持cpu加速指令,suport SSE4 ...

  4. linux源码编译安装OpenCV

    为了尽可能保证OpenCV的特性,使用OpenCV源码编译安装在linux上.先从安装其依赖项开始,以ubuntu 14.04.X为例讲解在Linux上源码编译安装OpenCV,其他linux版本可以 ...

  5. [笔记] Ubuntu 18.04源码编译安装OpenCV 4.0流程

    标准常规安装方法安装的OpenCV版本比较低,想尝鲜使用4.0版本,只好源码安装. 安装环境 OS:Ubuntu 18.04 64 bit 显卡:NVidia GTX 1080 CUDA:10.0 c ...

  6. win10 vs2015源码编译opencv、opencv_contrib、Tesseract

    1.软件包准备 opencv源码包地址:                官网  github opencv_contrib源码包地址:   github Tesseract源码包地址:        ...

  7. 能把opencv的源码也进行调试吗?(需要pdb文件才行)

    能把opencv的源码也进行调试吗?(需要pdb文件才行)1.我是用的Qt Creator,然后"工具\选项\调试器\概要\源码路径映射"中,选择"添加Qt源码" ...

  8. [记] OpenCV4 源码编译安装 | 记录

    OpenCV4 源码编译安装 | 记录 参考资料 官方文档:https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html 环境 wsl2 ...

  9. 解决 Ubuntu16.04 + opencv4.1 源码编译错误 Makefile:160: recipe for target 'all' failed

    最近源码编译 opencv,出现下面的错误 [ %] Built target opencv_dnn Makefile:: recipe for target 'all' failed google ...

  10. Ubuntu 环境 TensorFlow (最新版1.4) 源码编译、安装

    Ubuntu 环境 TensorFlow 源码编译安装 基于(Ubuntu 14.04LTS/Ubuntu 16.04LTS/) 一.编译环境 1) 安装 pip sudo apt-get insta ...

随机推荐

  1. redisson分布式锁的应用——秒杀、超卖 简单例子(分布式锁相关)

    1.常见的分布式事务锁 1.数据库级别的锁 乐观锁,给予加入版本号实现 悲观锁,基于数据库的for update实现 2.Redis,基于SETNX.EXPIRE实现 3.Zookeeper,基于In ...

  2. PYQT5学习(13):QMidArea同时显示多个窗口,创建多个独立的窗口

    QMidArea  参考文章:https://blog.csdn.net/jia666666/article/details/81670569 一种同时显示多个窗口的方法,创建多个独立的窗口,这些独立 ...

  3. Solution -「洛谷 P5610」「YunoOI 2013」大学

    Description Link. 区间查 \(x\) 的倍数并除掉,区间查和. Solution 平衡树. 首先有个基本的想法就是按 \(a_{i}\) 开平衡树,即对于每个 \(a_{i}\) 都 ...

  4. Solution -「CCPC Winter Camp Day 6 A」Convolution

    Description Link. 给定一个数列 \(\sf a_1,a_2,....a_n\),请求出下面这个结果在模 \(\sf 998244353\) 下的答案. \[\sum_{i=1}^{n ...

  5. Note -「virtual tree」shorter vrt

    Part. 1 Preface 没什么 preface. Part. 2 实现 具体来说就是把所有关键点按 \(\text{dfn}\) 排序,去重,然后求出相邻结点的 \(\text{LCA}\), ...

  6. 【RocketMQ】DLedger模式下的选主流程分析

    RocketMQ 4.5版本之前,可以采用主从架构进行集群部署,但是如果master节点挂掉,不能自动在集群中选举出新的Master节点,需要人工介入,在4.5版本之后提供了DLedger模式,使用R ...

  7. Python基础——垃圾回收、格式化输入输出、基本运算符、流程控制

    文章目录 每日测验 垃圾回收机制详解(了解) 引用计数 标记清除 分代回收 与用户交互 接收用户的输入 字符串的格式化输出 填充与格式化 基本运算符 算数运算符 比较运算符: >.>=.& ...

  8. .NET周刊【10月第1期 2023-10-01】

    国内文章 .NET应用如何防止被反编译 https://www.cnblogs.com/Can-daydayup/p/17736700.html 本文主要讲述了如何防止.NET应用被反编译.虽然无法完 ...

  9. mysql之简单的多表查询

    最简单的多表查询需要用到连操作符(join) 1.笛卡儿积 形式为table1 join table2.如: select e.fname,e.lname,d.name from employee e ...

  10. Apollo 配置中心的部署与使用经验

    前言 Apollo(阿波罗)是携程开源的分布式配置管理中心. 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验 特点 成熟,稳定 支持管理多环境/多集群/多命名空间的配置 ...