【环境配置篇】保姆级教学之Ubuntu20.04上编译OpenCV+CUDA

2023-11-10

保姆级教学之Ubuntu20.04上编译OpenCV+CUDA

自从发了上一期在Ubuntu20.04上配置深度学习环境的视频之后,我收到了很多小伙伴的反馈,其中有不少同学私信我表示“能不能教我怎么编译OpenCV呢”。但其实在Ubuntu上编译的教程网上已经有很多了,因此今天我们加亿点点难度,完成在Ubuntu20.04上完成OpenCV+CUDA的编译。这样后续使用OpenCV的时候,不管是传统算法也好,使用DNN模块推理深度学习算法也罢,都可以调用CUDA进行加速。

首先介绍下前置知识,如果看过我的上一期视频,那么我们已经安装过了CUDA,cuDNN和Anaconda,其路径分别为/usr/local/cuda/usr/local/cuda~/anaconda3/。明确之后我们就可以开始今天的教程了。

一、下载OpenCV和OpenCV Contrib的源码

  • 下载OpenCV源码

    • 打开GitHub,在搜索栏中搜索opencv,打开opencv的仓库后点击右侧的Releases,选择最新版(2022.6.22时最新版是4.6.0)后直接点击下载Source Code即可(下载zip包或者tar包皆可)。

在这里插入图片描述

  • 如果没有使用一些特殊手段,那么不出意外的下载速度会非常慢,可以选择通过中国镜像进行下载。

    • 打开GitCode,在搜索栏中搜索opencv/opencv(不这么搜可能找起来会有点麻烦)。点击克隆后下载源代码即可。

    在这里插入图片描述

    • 注意,如果一开始没有使用GitHub进行下载,那就务必使用中国镜像版本去使用,因为后续编译的时候还需要在GitHub上面拉几个包下来,不使用特殊手段的话是肯定下不下来的。并且GitCode这版我自己在写教程的时候发现,在右侧的发行版本中下载4.5.5版本之后出现了两个问题,第一是cmake的时候仍然是从GitHub而非镜像去拉取(即使我按照教程设置了OPENCV_DOWNLOAD_MIRROR_ID),没有特殊手段下载不了;第二是编译通过不了,从bug信息来看像是版本问题,确实有点迷惑。
  • 下载OpenCV Contrib源码

    • 在GitHub中搜索opencv_contrib,点击tags后下载最新版(2022.6.22最新版4.6.0),注意版本一定要与OpenCV匹配

    在这里插入图片描述
    在这里插入图片描述

    • 如果依然无法下载,一样的可以在GitCode上下载,直接克隆即可。

    在这里插入图片描述

    • 同时给大家提个建议,这种自行下载后本地编译的第三方库,可以像我一样在家目录或者什么目录下面创建一个文件夹local_install,然后把库全部放在里面,方便统一管理,也方便备份。

二、安装编译所依赖的库

  • 直接执行下述命令去安装相应的库即可:

    sudo apt update
    sudo apt upgrade
    sudo apt install build-essential cmake unzip pkg-config
    sudo apt install libjpeg-dev libpng-dev libtiff-dev
    sudo apt install libavcodec-dev libavformat-dev libswscale-dev
    sudo apt install libv4l-dev libxvidcore-dev libx264-dev
    sudo apt install libgtk-3-dev
    sudo apt install libblas-dev liblapack-dev gfortran
    sudo apt install python3-dev
    

    注意,如果有些库没有安装,那么OpenCV在编译到某个功能模块的时候,如果当前功能模块对没有安装的库存在依赖关系,就不会编译这个模块,可能在调用这个API的时候就会报一些奇奇怪怪的bug,比如:

    error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow
    
  • 使用unzip或者tar命令解压opencv和opencv_contrib的源码,准备进行编译;

三、使用CMake进行编译规则的配置

  • cd进入opencv文件夹,使用mkdir命令创建一个叫做build的文件夹,然后再cd进build文件夹。

    mkdir build
    cd build
    
  • 需要执行的CMake命令:

    cmake \
      		-D CMAKE_BUILD_TYPE=RELEASE \
          	-D CMAKE_INSTALL_PREFIX=/usr/local \
      		-D BUILD_opencv_python2=OFF \
      		-D OPENCV_PYTHON3_VERSION=3.9 \
      		-D PYTHON_EXECUTABLE=/home/ubuntu/anaconda3/envs/pt/bin/python3 \
      		-D PYTHON_DEFAULT_EXECUTABLE=/home/ubuntu/anaconda3/envs/pt/bin/python3 \
      		-D PYTHON3_EXECUTABLE=/home/ubuntu/anaconda3/envs/pt/bin/python3 \
      		-D PYTHON3_INCLUDE_DIR=/home/ubuntu/anaconda3/envs/pt/include/python3.9m \
      		-D PYTHON3_LIBRARY=/home/ubuntu/anaconda3/envs/pt/lib/libpython3.9.so \
      		-D PYTHON3_NUMPY_INCLUDE_DIRS=/home/ubuntu/anaconda3/envs/pt/lib/python3.9/site-packages/numpy/core/include \
      		-D PYTHON3_PACKAGES_PATH=/home/ubuntu/anaconda3/envs/pt/lib/python3.9/site-packages \
      		-D INSTALL_PYTHON_EXAMPLES=ON \
      		-D INSTALL_C_EXAMPLES=OFF \
      		-D OPENCV_ENABLE_NONFREE=ON \
      		-D BUILD_TIFF=ON \
      		-D OPENCV_EXTRA_MODULES_PATH=/home/ubuntu/local_install/opencv_contrib/modules \
      		-D BUILD_EXAMPLES=ON \
      		-D WITH_CUDA=ON \
      		-D WITH_CUDNN=ON \
      		-D OPENCV_DNN_CUDA=ON \
      		-D WITH_CUBLAS=ON \
      		-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
      		-D OpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so \
      		-D OpenCL_INCLUDE_DIR=/usr/local/cuda/include/ \
      		..  # 表示CMakeLists.txt文件在上一级目录中
    

    先提一个容易出问题的点,此处家目录不能写~,解析不了,而是要写全(如/home/ubuntu)。接下来我们对其中较为重要的变量进行解释,其中的路径需要按照自己机器的情况自行更改:

    • 设置Python的可执行文件路径为Anaconda中虚拟环境(envs)下的pt环境下的Python的可执行文件(二进制文件,一般放在bin(binary)文件夹下,Linux下的二进制文件(或可执行文件)类似于Windows下的.exe文件,能够直接运行);

    • PYTHON_EXECUTABLE=/home/ubuntu/anaconda3/envs/pt/bin/python3
      PYTHON_DEFAULT_EXECUTABLE=/home/ubuntu/anaconda3/envs/pt/bin/python3 \
      PYTHON3_EXECUTABLE=/home/ubuntu/anaconda3/envs/pt/bin/python3 \
      

      以上部分如果是跟着上一个教程配置的Anaconda的环境,只需要改下家目录中的用户名就可以直接使用了。

    • 设置Python环境中的include文件夹路径、Python的动态库路径、Python环境中NumPy环境的include文件夹路径和Python环境下的第三方库安装路径;

      PYTHON3_INCLUDE_DIR=/home/ubuntu/anaconda3/envs/pt/include/python3.9m \
      PYTHON3_LIBRARY=/home/ubuntu/anaconda3/envs/pt/lib/libpython3.9.so \
      PYTHON3_NUMPY_INCLUDE_DIRS=/home/ubuntu/anaconda3/envs/pt/lib/python3.9/site-packages/numpy/core/include \
      PYTHON3_PACKAGES_PATH=/home/ubuntu/anaconda3/envs/pt/lib/python3.9/site-packages \
      

      同上,如果是跟着上一个教程配置的Anaconda的环境,更改家目录中的用户名和Python的版本即可使用。

    • 设置opencv_contrib的路径;

      OPENCV_EXTRA_MODULES_PATH=/home/ubuntu/local_install/opencv_contrib/modules \
      
    • 设置带上CUDA、cuDNN进行编译,并设置CUDA的路径(此处CUDA的路径一般不需要更改);

      WITH_CUDA=ON \
      WITH_CUDNN=ON \
      OPENCV_DNN_CUDA=ON \
      WITH_CUBLAS=ON \
      CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
      OpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so \
      OpenCL_INCLUDE_DIR=/usr/local/cuda/include/ \
      
    • 此处提出一个小技巧,如果我们直接复制了上述CMake的命令,并在终端中Ctrl+v,并在终端里面修改这些变量中的路径不是那么方便。我的建议是,先在build文件夹中创建一个shell脚本,比如命名为build.sh,可以先用自己擅长的编辑器如vim之类的修改CMake命令中的变量,再在终端内sh ./build.sh运行这个脚本。

    • 假如CMake最后出现了如下的信息,则说明在安装了Anaconda之后,它的环境遮挡住了系统的环境,编译的时候也会报各种各样稀奇古怪的问题,此时需要在对应的终端的配置文件里面将Anaconda的环境覆盖掉。覆盖的方法就是在对应的终端配置文件之中注释掉Anaconda的环境。

      CMake Warning at cmake/OpenCVUtils.cmake:1547 (add_library):
        Cannot generate a safe runtime search path for target opencv_highgui
        because files in some directories may conflict with libraries in implicit
        directories:
      
          runtime library [libpangocairo-1.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
          runtime library [libpango-1.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
          runtime library [libharfbuzz.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
          runtime library [libcairo-gobject.so.2] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
          runtime library [libcairo.so.2] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
          runtime library [libgio-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
          runtime library [libgobject-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
          runtime library [libgthread-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
          runtime library [libglib-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
            /home/ubuntu/anaconda3/lib
      
        Some of these libraries may not be found correctly
      
  • 执行make进行编译

    make -j12  # 编译,-j表示调用12个线程进行编译
    sudo make install  # 把编译后的头文件和库写入到指定文件夹中
    sudo ldconfig  # 令动态链接库能够为系统所共享
    

四、验证是否编译成功

  • C++环境
    • 我们首先验证下C++环境是否有正常编译并安装。我们创建一个叫做test的文件夹,然后我们创建一个main.cpp的文件,尝试是否能够正常引入OpenCV的头文件。

      #include <opencv2/opencv.hpp>
      
      int main()
      {
        	return 0;
      }
      
    • 然后我们再创建个CMakeLists.txt的文件来写CMake:

      cmake_minimum_required(VERSION 3.16)                                                                                                                                                                                  
      project(opencv_test)                                                                                
                                                                                                          
      set(CMAKE_CXX_STANDARD 14)                                                                          
      find_package(OpenCV REQUIRED)                                                                       
                                                                                                          
      add_executable(opencv_test main.cpp)                                                                
                                                                                                          
      target_link_libraries(opencv_test ${OpenCV_LIBS})                                                   
      
    • 同样为了方便管理CMake配置的编译规则以及编译过程中产生的中间文件,我们创建一个build文件夹,cd进去后执行cmake命令即可配置编译规则,生成一个MakeFile文件;

      mkdir build
      cd build
      cmake ..  # 执行cmake,..表示CMakeLists.txt在上一层路径中
      

在这里插入图片描述

  • 如果没有出现什么问题,此时直接使用make命令就可以直接编译了,编译结束后会生成一个opencv_test的可执行文件,可以使用./opencv_test直接运行。
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【环境配置篇】保姆级教学之Ubuntu20.04上编译OpenCV+CUDA 的相关文章

随机推荐

  • 语音识别研究的四大前沿方向

    以下转自 http blog csdn net whaoxysh article details 19402337 鸡尾酒会问题 cocktail party problem 是在计算机语音识别领域的一个问题 当前语音识别技术已经可以以较高
  • 微信小程序实现滑动/点击切换Tab

    背景 swiper scroll view实现滑动 点击切换Tab 以及scroll left的使用 文末分享源代码 记得点赞 关注 收藏 1 实现效果 2 实现步骤 2 1 scroll view实现tab列表 scroll view 可
  • react+antd 修改主题色

    项目使用的时 react 框架 和 ant design ui组件库 antd 官网中对定制主体是这样说的 详见 https ant design docs react customize theme cn 官网说的是 antd 的样式使用
  • Python中的几大产生随机数的函数range,randint以及xrange函数

    文章目录 1 xrange 函数 2 range 函数 3 randint 函数 示例代码 1 xrange 函数 现在python的版本大多都已经采用python3 x版本 python2 x版本已经逐渐不被人们所使用 xrange 函数
  • linux图形界面切换到字符界面

    redhat linux图形界面切换到字符界面 1 X Window图形界面和字符界面自由切换 一 图形界面切换到字符界面 在X Window图形操作界面中按 Alt Ctrl Fn n 1 6 就可以进入Console字符操作界面 这就意
  • C++强制类型转换运算符-dynamic_cast、const_cast、static_cast、reinterpret_cast、dynamic_pointer_cast、const_pointer

    C 强制类型转换 dynamic cast 回答的问题 是否能将某个对象的地址安全地赋值给一个特定类型的指针 同时也回答了强制类型转换是否安全的问题 dynamic cast用于类继承层次间的指针或引用转换 主要还是用于执行安全的向下转型
  • AddBinary[LeetCode]

    掌握了刚才的方法 这类问题都解决了 class Solution public string addBinary string a string b int m a size 1 int n b size 1 int carry 0 str
  • kaggle数据分析实践项目练习——人力资源分析

    学习完 利用python进行数据分析 之后 学习了Numpy pandas matplotlib几个包的使用 于是着手准备在kaggle上找数据集进行练习 在kaggle中找到了人力资源分析项目 看到不少人拿这个项目练手 本文将会分析为何公
  • 【Hadoop系列】linux下 root用户免密码登录远程主机 ssh

    SSH原理 Hadoop系列 linux SSH原理解析 操作环境 CentOS 6 5 操作对象 用户A主机和远程主机B 正文部分 斜体加粗代表linux指令 linux下 非root用户免密码登录远程主机 ssh请转至此链接 XXXXX
  • Linux CentOS7命令及命令行

    Linux CentOS7中命令及命令行是非常重要的概念 对大多数初学者来说是既熟悉又了解甚少 本文初步讨论这方面的内容 与同行者交流 一 命令 命令又称为指令 英语命令 command 可用简写cmd表示 在终端命令行中执行的一段字符 一
  • QT5.14.2+VS2017环境安装

    1 下载Qt5 14 2以及qt vs插件 1 Qt官网下载地址 操作系统是win10企业版 在目录qt下找到程序qt opensource windows x86 5 14 2 exe 在目录vsaddin下找到程序qt vsaddin
  • 时间基础概念及Linux中的时间函数

    时间基础概念及Linux中的时间函数 时间相关概念 GMT 时间 UTC 时间 时区 Time Zone 夏令时 DST 本地时间 localtime Linux 系统中的时间 时钟基础概念 系统节拍数 jiffies Linux系统查看时
  • 生产者与消费者问题?

    生产者消费者模式是并发 多线程编程中经典的设计模式 简单来看 就是一个类负责生产 一个类负责消费 举例来说 一个变量 生产者不断增加这个变量 消费者不断减少这个变量 在互联网应用中 抢票机制就是应用了该模式 比如大麦网演唱会门票抢票 123
  • linux作业后台管理

    参考 http blog itpub net 26736162 viewspace 2142674 常用命令 参考http blog chinaunix net uid 26785297 id 3375270 html fg bg jobs
  • 一文搞清到底什么是 .NET?

    现在各种 NET 满天飞 别说新手了 连我这样的老手都差点被绕进去 到底什么是 NET 呢 通俗易懂 什么是 NET 什么是 NET Framework 什么是 NET Core 这篇文章好长呀 不知道你看完了没有 其实最关键的是核心的几个
  • 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。(C语言)基础版

    输入格式 输入分两行 分别在每行给出由若干个正整数构成的非降序序列 用 1表示序列的结尾 1不属于这个序列 数字用空格间隔 输出格式 在一行中输出两个输入序列的交集序列 数字间用空格分开 结尾不能有多余空格 若新链表为空 输出NULL in
  • session机制详解以及session的相关应用

    session是web开发里一个重要的概念 在大多数web应用里session都是被当做现成的东西 拿来就直接用 但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求 当碰到这样的情况时候我们需要更加深入的理解sessi
  • layui 前端下载文件方法

    文件下载 function downLoadFile ids name 获取token var tableName layui data setter tableName 创建下载请求 var oReq new XMLHttpRequest
  • 学计算机的的用87键键盘可以吗,键盘87和108键区别

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 键盘87和108键区别是 1 87键的键盘有87个按键 108键的键盘有108个按键 2 108键的键盘在87键键盘的基础上增加了17个数字辅助按键和4个功能键 键盘 Ke
  • 【环境配置篇】保姆级教学之Ubuntu20.04上编译OpenCV+CUDA

    保姆级教学之Ubuntu20 04上编译OpenCV CUDA 自从发了上一期在Ubuntu20 04上配置深度学习环境的视频之后 我收到了很多小伙伴的反馈 其中有不少同学私信我表示 能不能教我怎么编译OpenCV呢 但其实在Ubuntu上