OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)

windows下的编译

需要安装的内容有:VS2019 需要安装的有C++的桌面开发
(不使用VS2022的原因是22使用的是MSVC17而不是16了,很可能会出现版本不匹配)
CMAKE,opencv的源码(下面那套可以使用,但是需要该的地方有点多,因为下面那套是Ubuntu的专用)
camke:https://cmake.org/download/
opencv4.4.0:https://opencv.org/releases/
opencv4.4.0-contrib:https://github.com/opencv/opencv_contrib/releases
opencv下载的时候注意是下载源码,而不是下载exe,exe是编译版本
cuda和cudnn版本下载参见Ubuntu的,内容很相近

在桌面进入到nvidia控制面板(windows11也是这样,在更多选项里面)
帮组栏查看系统信息,选择组件,看到对应的信息
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第1张图片
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第2张图片
然后去https://developer.nvidia.com/cuda-toolkit-archive下载cuda(选择对应的版本)
win+r cmd
输入nvcc -V 看一下有无输出:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第3张图片
cudnn与下面有些差距:
udnn就是一个压缩包,解压文件夹,将解压后的文件夹下的文件拷贝到cuda安装目录下,与之相对应的文件夹下
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第4张图片
cmake部分的操作与Ubuntu同理,可以去下面进行参考
如图所示,打开项目后点击ALL_BUILD–>生成,注意是debug+x64
debug编译完成后可以再编译一个release x64版本的,release版本速度会更快,但要注意把两个opencv分开,并且分别都要配置环境变量
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第5张图片
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第6张图片
编译时间大概2-3小时
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第7张图片
“解决方案资源管理器—>CMakeTargets—>INSTALL—>仅用于此项目—>仅生成INSTALL,然后又是好一会
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第8张图片
完成
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第9张图片
此时在build文件夹下,可以找到install文件夹,里面的内容就是我们需要的opencv库
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第10张图片
完成后把install/x64/vc16/bin下的3个dll文件复制到c/WINDOWS/system32目录下
然后记得把这几个文件夹添加到环境变量当中去

编译

在cmake全部搞完之后,进行打开工程,有一个按钮叫做 open project
然后就会使用VS进行打开

Ubuntu下的编译

首先,我这边使用的是OpenCV4.4+contrib+cuda+cudnn的安装过程
我使用的是c++
一般来说,这个东西很让人无语,不过按照我这个教程来应该问题不大的,因为这些我都验证过了
首先要下载一些opencv的依赖库,下载cuda和cudnn

NVIDIA驱动、cuda、cudnn的安装

安装cuda之前需要安装NVIDIA的驱动
最简单的方式:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第11张图片
然后附加驱动:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第12张图片
可以直接选择然后应用更改,建议不要用server的,不要用最新的,不要用tested的
然后就可以直接安装了,安装之后打开终端输入:

nvidia-smi

OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第13张图片
出现这个就是说明已经成功的打上了驱动
然后去:https://developer.nvidia.com/cuda-toolkit-archive
找对应的cuda 的版本,建议是同一个版本的:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第14张图片
然后选择对应的系统的版本:
一版都是x86_64 然后 选择Ubuntu 选择系统的版本,(建议使用network或者deb(local))
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第15张图片
下面有对应的命令链接,可以直接使用命令行输入进去就可以了
安装后,在命令行当中输入:

nvcc -V

OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第16张图片
接下来去下载cudnn
https://developer.nvidia.com/rdp/cudnn-archive
这个链接,进行选择与cuda版本对应的cudnn的版本
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第17张图片
(一般来说这个需要登录一个NVIDIA的开发者的账号,自己申请吧)
举个例子:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第18张图片
下载这三个:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第19张图片
(这个是x86_64框架的,下面那个aarch是arm框架的)
然后对应这安装就可以了,安装的顺序建议:developer=>runtime=>samples
就可以了

opencv的下载与编译

下载opencv+opencvcontrib的包
opencv_contrib-4.4.0.zipopencv-4.4.0.zip
(别的版本的基本通用,思想都是一样的)
然后安装对应的依赖库

sudo apt-get install build-essential
sudo apt-get install cmake libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff5-dev libdc1394-22-dev # 处理图像所需的包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev # 处理视频所需的包
sudo apt-get install libatlas-base-dev gfortran # 优化opencv功能
sudo apt-get install python-dev python-numpy
# 以下三条命令是用于安装libjasper-dev
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

建议自己先换源之后的再下载,或者挂梯子之后下载
下载成功不成功都可以(因为有的arm的板子会出现有个包没有),但是最好所有的命令都跑一遍
安装对应的需要的软件

sudo apt-get install cmake
sudo apt-get install make
sudo apt-get install cmake-gui

跑完之后,在下载的目录下解压压缩包,然后新建一个名字为build 的目录:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第20张图片
在命令行内输入:

cmake-gui

OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第21张图片
(这个地方需要安装的有对应的gcc的编译器)
第一个目录栏选择opencv4.4这个文件夹
第二个目录栏选择build这个文件夹
然后进行第一次的configure
对应的东西选择默认就可以:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第22张图片
第一次configure之后看到:
image.png
在上面的搜索框内寻找:
OPENCV_EXTRA_MODULES_PATH
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第23张图片
记得要用cmake-gui自带的那个文件选择器选择刚刚解压的contrib文件夹下面的moudles文件
然后进行搜索OPENCV_ENABLE_NONFREE:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第24张图片
勾选上,然后按第二次的configure
一般来说,这个时候会出现一些文件下载不下来,不用担心,我在后面会告诉你怎么做(但是在我给出的包内,文件是已经下载到本地了的,只需要自己手动修改路径就可以,当时懒,没有改成相对路径,给的绝对路径)
第二次configure之后,在搜索框内寻找:CUDA的选项,全部勾选上(不需要CUDA的可以不勾选):
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第25张图片
继续搜索:build_opencv_world这个选项,可以快速的链接所有的库,不用自己一个一个的添加模块了:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第26张图片
然后进行第三次的configure
然后去寻找自己的显卡对应的算力是多少(一般来说去英伟达的官网进行查询,我的是3060ti,是86的算力,需要改成8.6)在cmake的搜索框内继续搜索:CUDA_ARCH_BIN
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第27张图片
改成自己在英伟达官网上查到的那个值(注意:在比较新的显卡的算力表,opencv较低的版本并步支持,因此尽量选择和自己算力相近的那个)
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第28张图片
可以大概参考一下这个图,但并不是所有的显卡这里都有,还是去英伟达官网查到的数据比较准
jetson 的可以参考这个:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第29张图片
比如jetson nano是5.3,那么在ARCH_BIN这个地方就自己手动修改成为5.3,并且保留5.2,剩余的其他全部删除,数字之间的间隔是个英文的;
接下来就再次点击configure
看一下cmake的下面的输出:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第30张图片
(没有安装dnn或者dnn安装的版本错误的情况下,dnn是no是对的)可以看到直接的选项之类的东西,模块已经支持的驱动和对应的语言。

接下来按generate:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第31张图片
出现这个就是快要成功了

然后去对应的build的文件夹下面打开终端,输入:

make -j

(这个地方呢,输入个-j就可以了,不需要输入-j12之类的,如果安装电脑cpu的逻辑核心数输入的话,就编译的很快,但是这个期间会很卡)
然后等待大约半个小时左右
没有报错的话,就可以输入:

sudo make install

OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第32张图片
然后就安装成功了

把opencv添加到环境变量当中:

还是在终端:

sudo nano /etc/profile

在最后一行添加:

export  PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 

按住ctrl+o保存 ctrl+x退出
然后输入:

source profile

这个时候有可能会报一个错误,说找不到这个路径
然后就熟练的打开这个路径
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第33张图片
发现确实没有
那么就自己手动新建一个名字叫做 pkgconfig的文件夹
终端输入:

sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv4.pc
sudo gedit opencv4.pc

会打开一个文本编辑器:
在这个里面输入:

# Package Information for pkg-config

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib/
includedir_old=${prefix}/include/opencv4/opencv2
includedir_new=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.4.0
Libs: -L${exec_prefix}/lib -opencv_img_hash -lopencv_world
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}

这样的话,就在此:

cd /etc
source profile

大功告成!

下载报错:

Ubuntu和windows是一样的,下载和修改都是这样的
举个例子:
在opencv的编译当中经常下载报错的是:
ippicv_2020_lnx_intel64_20191018_general.tgz
这个东西下面的:
这个文件是在opencv4.4/3rdparty/ippicv文件夹下面
(一般来说建议直接搜索,配置的多了记住了也行)
找到:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第34张图片
ippicv.cmake

function(download_ippicv root_var)
  set(${root_var} "" PARENT_SCOPE)

  # Commit SHA in the opencv_3rdparty repo
  set(IPPICV_COMMIT "a56b6ac6f030c312b2dce17430eef13aed9af274")
  # Define actual ICV versions
  if(APPLE)
    set(OPENCV_ICV_PLATFORM "macosx")
    set(OPENCV_ICV_PACKAGE_SUBDIR "ippicv_mac")
    set(OPENCV_ICV_NAME "ippicv_2020_mac_intel64_20191018_general.tgz")
    set(OPENCV_ICV_HASH "1c3d675c2a2395d094d523024896e01b")
  elseif((UNIX AND NOT ANDROID) OR (UNIX AND ANDROID_ABI MATCHES "x86"))
    set(OPENCV_ICV_PLATFORM "linux")
    set(OPENCV_ICV_PACKAGE_SUBDIR "ippicv_lnx")
    if(X86_64)
      set(OPENCV_ICV_NAME "ippicv_2020_lnx_intel64_20191018_general.tgz")
      set(OPENCV_ICV_HASH "7421de0095c7a39162ae13a6098782f9")
    else()
      set(OPENCV_ICV_NAME "ippicv_2020_lnx_ia32_20191018_general.tgz")
      set(OPENCV_ICV_HASH "ad189a940fb60eb71f291321322fe3e8")
    endif()
  elseif(WIN32 AND NOT ARM)
    set(OPENCV_ICV_PLATFORM "windows")
    set(OPENCV_ICV_PACKAGE_SUBDIR "ippicv_win")
    if(X86_64)
      set(OPENCV_ICV_NAME "ippicv_2020_win_intel64_20191018_general.zip")
      set(OPENCV_ICV_HASH "879741a7946b814455eee6c6ffde2984")
    else()
      set(OPENCV_ICV_NAME "ippicv_2020_win_ia32_20191018_general.zip")
      set(OPENCV_ICV_HASH "cd39bdf0c2e1cac9a61101dad7a2413e")
    endif()
  else()
    return()
  endif()

  set(THE_ROOT "${OpenCV_BINARY_DIR}/3rdparty/ippicv")
  ocv_download(FILENAME ${OPENCV_ICV_NAME}
               HASH ${OPENCV_ICV_HASH}
               URL
                 "${OPENCV_IPPICV_URL}"
                 "$ENV{OPENCV_IPPICV_URL}"
                 "file:/home/hit_kk/opencv/opencv-4.4.0/3rdparty/ippicv/"#"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"
               DESTINATION_DIR "${THE_ROOT}"
               ID IPPICV
               STATUS res
               UNPACK RELATIVE_URL)

  if(res)
    set(${root_var} "${THE_ROOT}/${OPENCV_ICV_PACKAGE_SUBDIR}" PARENT_SCOPE)
  endif()
endfunction()

OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第35张图片
注意这个地方的这句话,这个就是下载链接,一般需要我们手动下载,然后进行修改这个路径:
这个下载链接的格式:

https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/

前面的东西不变
image.png
这个东西在该文件的上面寻找
image.png
把这个东西更换为这一串的md5码
然后接下来找到需要的文件名字:
(因为在Linux下面,所以需要下载的是image.png
那么整个的链接:
https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_lnx_intel64_20191018_general.tgz
输入到网页里面,就可以直接下载下来了:
OpenCV源码+CUDA+CUDNN编译(Ubuntu+Windows)_第36张图片
下载之后,放到哪里都行,然后进行修改这个路径
把这个路径屏蔽掉(这里# 是注释)
然后输入:

"file::你放那个文件的路径再加个/"

实例:“file:/home/hit_kk/opencv/opencv-4.4.0/3rdparty/ippicv/”
要注意,不要带有文件名,不要中文路径,然后保存,重新点击configure就会发现这个东西不再报错了。

你可能感兴趣的:(计算机视觉)