在Windows上使用Visual C++和Visual Studio编译安装OpenCV CUDA Python

获取OpenCV源代码

首先,正如标题所示,我们需要用GitHub克隆下来对应的源代码。一共分为两个源代码仓库,一个是opencv/opencv,一个是opencv/opencv_contrib
这里我就不放出官方的Github仓库了,大家可以对应自己的需要的版本,在tags中进行选择,对应进行克隆即可,这里我以我的4.5.2版本进行演示。因为涉及到要进行编译与生成,因此我们还需要创建一个build文件

因此,现在我们的文件树应该是这个样子的:

    目录: E:\opencvTest


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          2022/8/9     22:46                build
d-----          2022/8/9     22:44                opencv
d-----          2022/8/9     22:46                opencv_contrib

安装CMake

下载CMake

我们访问CMake官网来下载CMake Windows安装包
在这里插入图片描述
点击Download Latest Release进入到下载页面

在这里我偷了个懒,选择.msi安装文件
在这里插入图片描述

安装CMake

下载好后我们双击运行CMake安装包
在这里插入图片描述
《祖传同意协议》…
点击Next之后,CMake安装工具会询问我们是否将CMake添加到$PATH当中,即环境变量当中,这里我们选择Add CMake to the system PATH for all users
在这里插入图片描述

指定安装路径
在这里插入图片描述

验证安装

CMD或者PowerShell中输入cmake --version,将会返回我们安装的CMake版本

PS C:\Users\98246> cmake --version
cmake version 3.24.0

CMake suite maintained and supported by Kitware (kitware.com/cmake).
PS C:\Users\98246>

使用CMake GUI进行预编译准备

安装好CMake后,我们将会得到cmake clicmake gui两个工具
由于我并没有学习过如何编写CMakeList.txt,因此我们这里直接使用傻瓜式工具:CMake GUI,在Windows的搜索栏中输入:CMake GUI即可打开。
在这里插入图片描述
打开之后我们得到了如下的界面
在这里插入图片描述
这里有几个重要的功能

  • where is the source code:字面意思,源代码在哪儿,因此你需要将OpenCV的源代码位置指定出来
  • where to build the binaries:也是字面意思,在哪里构建二进制文件,这也是为什么刚才创建了build文件夹
  • Configure:配置按钮,这个按钮并不会实际生成CMake配置文件,而是CMake帮你测试你的编译选项是否可以正常编译
  • Generate:在build中生成CMake配置项

在本案中,我们的路径配置是如下的情况,你需要将其改变为你OpenCV源代码和OpenCV Contrib的路径
在这里插入图片描述
那么现在我们点击Configure按钮,但是这时CMake并不会先进性Debug,因为我们没有指定我们的编译工具,在Windows平台上,CMake默认的编译工具是MSVC,因此当我们第一时间点击Configure按钮的情况是这样的
在这里插入图片描述
是的,CMake需要我们指定编译引擎,由于我现在目前使用的是Visual Studio 2022,因此在编译完成后,CMake将生成一个标准的Visual Studio 2022项目文件
第二项是编译平台的架构,这里我们选择X64进行编译,并且下面使用默认的编译器
因此我们这次的参数是这样的
在这里插入图片描述
可以看到CMake的编译结果如下:
在这里插入图片描述
CMake正确的识别到了我们Anaconda的环境,另外值得一提的是,如果你的Python不可用,请升级Numpy==1.20.3后重试。
处理好后,我们发现得到了如下这么多的编译选项:
在这里插入图片描述
但这些参数并不都是我们需要使用的,首先我们需要让OpenCV支持CUDA,那么我们先修改WITH_CUDATrue
在这里插入图片描述
其次我们需要让OpenCV支持cuDNN加速,因此我们在Search搜索框中接着输入:dnn,并保证如下选项被勾选
在这里插入图片描述
另外勾选ENABLE_FAST_MATHBUILD_opencv_world
在这里插入图片描述
在这里插入图片描述
最后我们修改OPENCV_EXTRA_MOUDLES_PATH来在编译时加载我们OpenCV的扩展库,也就是我们的contrib所在的路径
在这里插入图片描述
确认好这些选项被勾选后,我们点击Configure来使得配置测试并生效

请注意,该步骤如果出现域名无法解析时,则证明你需要开启科学上网并重新启动CMake

在这里插入图片描述
可以看到CMake的执行结果返回了我们要看到结果:CUDA yes,版本11.7,以及该版本CUDA驱动支持的GPU计算能力(Cpmputbility)。
cuDNN也是yes,并且正确的读取到了版本号8.4.1

在接下来最终的修改时,我们需要明确自己的CUDA GPU的计算能力,这里大家可以通过维基百科进行查询
这里我使用的是RTX2060,因此我对应的GPU Compubility是7.5,那么对应的,我在使用NVCC进行CUDA程序编译时需要将-arch参数设置为75。
同理,我们的最终参数也是去修改编译.cu时文件时GPU架构型号的参数,因此我们在搜素框中输入:arch,找到CUDA_ARCH_BIN选项,将其只保留你电脑中对应GPU的计算能力即可,例如在我的情况中,我只需要保存7.5即可。对于大部分基于图灵(NVIDA Turing)的GPU,例如RTX2060-RTX2080Ti,可以使用7.5作为参数,而针对全行的安培架构的GPU,我们则需要将其设置为8.0。
在这里插入图片描述
另外我们需要指定CMake的配置类型,是Debug还是Release,在本例中我们只需要将CMAKE_CONFIGURATION_TYPES保留Release即可。
在这里插入图片描述

好了我们在点击Configure按钮使其生效
在这里插入图片描述
确认没有问题后点击Generate生成配置文件,由于这里我已经生成了,因此不再赘述了。

进行生成编译与安装C标准库和Python库

在执行上述Generate后我们得到了完整的build路径,打开这个路径我们发现有一个OpenCV.sln的Visual Studio解决方案文件,使用Visual Studio双击打开它
在这里插入图片描述
通过Visual Studio的解决方案资源管理器我们看到这个解决方案下的文件结构,那么对于我们而言,我们这里需要使用的文件是:ALL_BUILDINSTALLopencv_python3
请一定按照这个顺序,如果你问为什么要这样,理由很简单:编译生成->安装C标准库->绑定到Python3环境。
按照这个顺序,我们右键这些cpp文件,点击生成按钮分别执行。这里我就不演示编译执行的过程了,毕竟我不想再让我的电脑冒一次烟…

验证Python

首先我们先确认OpenCV是否被成功绑定

In [1]: import cv2

In [2]: cv2.__version__
Out[2]: '4.5.2'

可以看到版本正确4.5.2
那么我们测试CUDA GPU是否可用,这里防止终端被沾满,因此使用cuda.printShortCudaDeviceInfo()函数打印粗略信息,该函数接收一个GPU设备索引ID,由于我的电脑上只有一张GPU,因此输入0即可。

In [1]: from cv2 import cuda

In [2]: cuda.printShortCudaDeviceInfo()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-9a7c711519df> in <module>
----> 1 cuda.printShortCudaDeviceInfo()

TypeError: printShortCudaDeviceInfo() missing required argument 'device' (pos 1)

In [3]: cuda.printShortCudaDeviceInfo(0)
Device 0:  "NVIDIA GeForce RTX 2060"  6144Mb, sm_75, Driver/Runtime ver.11.70/11.70

写在最后

为什么会有想安装OpenCV CUDA的念头呢,因为之前自己尝试学习OpenCV时,发现帧数很低,因此希望图像能够由GPU进行渲染,以及使用GPU进行识别(说白了就是笔者没圆子买Jetson罢了)。
如果你觉得这篇文章有用,请三连再走,我们下篇文章再见!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Day(AKA Elin)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值