【保姆级教程】Ubuntu编译opencv源码并安装完整过程,图文详细,亲测有效


0 关于

  • Ubuntu版本:Ubuntu 20.04
  • OpenCV演示版本:4.10.0
  • 本文参考了多篇博客和教学视频,经本人亲测安装成功,故总结提炼供大家参考。
  • 若在安装过程出现任何问题欢迎评论、私信与我交流,不过请描述清楚你遇到的问题。

1 安装步骤

1.1 准备工作

  1. 准备工作一:执行指令sudo apt updatesudo apt upgrade以更新软件包列表和升级所有软件包
  2. 准备工作二:执行指令sudo apt-get install -y unzip cmake build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev安装opencv所需要的构建工具和依赖库。

1.2 获取源码文件并解压

  1. 进入官网。官网地址:官网地址
  2. 获取某个版本(演示4.10.0)的下载链接。官网陈列了多个版本,鼠标移动到对应版本的Sources上右击鼠标选择“复制链接地址”,得到链接地址:https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip,你也可以直接使用我这个地址。
    在这里插入图片描述
    在这里插入图片描述
  3. 执行指令wget https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip下载源码压缩包。
    在这里插入图片描述
  4. 执行指令unzip 4.10.0.zip解压源码压缩包,之后执行ls指令可以发现生成了opencv-4.10.0文件夹。
    在这里插入图片描述

1.3 编译并安装

  1. 执行指令cd opencv-4.10.0/ && mkdir build && cd build在解压后的文件夹创建一个build目录并进入build目录,该目录用于保存构建过程的中间文件。执行指令之前请确保当前处于opencv目录。
    在这里插入图片描述

  2. 执行指令sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..以生成构建文件(通常是 Makefile )。cmake并不是一个编译器,而是用于生成Makefile的工具,然后通过Makefile调用编译器进行编译构建,如make -j4(后续马上会用)。 指令执行成功时如下图所示。

    • CMAKE_BUILD_TYPE=Release: 指定编译类型为Release
    • CMAKE_INSTALL_PREFIX=/usr/local: 指定安装路径,默认安装在/usr/local目录下
      在这里插入图片描述
  3. 执行指令sudo make -j8使用Makefile对项目进行编译构建。

    • -j8:指定使用8个CPU核进行编译,这个数字根据自己机器情况决定。
      在这里插入图片描述
      在这里插入图片描述
  4. 执行指令sudo make install安装OpenCV。
    在这里插入图片描述
    在这里插入图片描述

1.4 编写配置文件

  1. 执行sudo nano /etc/ld.so.conf打开配置文件并编辑,在配置文件中添加一行/usr/local/lib。随后依次按Ctrl+SCtrl+X保存并退出配置文件。

    • /etc/ld.so.conf 是Linux系统中的一个重要配置文件,它用于指定动态链接器(ld.so)搜索动态库(共享库)的路径。动态链接器是负责在程序运行时加载共享库的系统组件。
    • 添加/usr/local/lib是因为前文cmake指令的CMAKE_INSTALL_PREFIX=/usr/local指定了安装目录为usr/local,所以opencv会把动态库放在/usr/local/lib中,在配置文件添加后即可搜索到opencv的动态库。
      在这里插入图片描述
  2. 执行指令ldconfig使配置文件生效。

  3. 执行指令cd /usr/local/lib && mkdir pkgconfig && cd pkgconfig && nano opencv.pc/usr/local/lib/pkgconfig目录下创建一个名为opencv.pc的配置文件。该.pc 文件是 pkg-config 的配置文件,用于在编译和链接时提供库的编译和链接信息。pkg-config是一个帮助程序,用于自动检测系统中的库,并为编译器和链接器提供必要的标志。

  4. 在上述打开的.pc配置文件中添加如下内容:
    在这里插入图片描述

    prefix=/usr/local
    exec_prefix=${prefix}
    includedir=/usr/local/include
    libdir=/usr/local/lib
     
    Name: OpenCV
    Description: Open Source Computer Vision Library
    Version: 4.10.0
    Libs: -L${exec_prefix}/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core
    Libs.private: -ldl -lm -lpthread -lrt
    Cflags: -I${includedir}
    

    解释:

    • prefix=/usr/local:这是安装前缀,指定了库文件、头文件等的安装基础目录。
    • exec_prefix=${prefix}:这是可执行文件的安装前缀,通常与 prefix 相同,用于存放可执行文件和库文件。
    • includedir=/usr/local/include:头文件的安装目录,编译时需要包含这个目录以访问库的头文件。
    • libdir=/usr/local/lib:库文件的安装目录,链接时需要指定这个目录以访问库文件。
    • Name: OpenCV:库的名称,这里是 OpenCV(Open Source Computer Vision Library)。
    • Description: Open Source Computer Vision Library:库的描述,这里是“开源计算机视觉库”。
    • Version: 4.4.0:库的版本号,这里是 4.4.0。
    • Libs: -L${exec_prefix}/lib -lopencv_stitching … -lopencv_core:链接时需要的库和标志。-L 指定库文件搜索路径,-l 指定要链接的库。这里列出了 OpenCV 的所有模块和它们对应的库。
    • Libs.private: -ldl -lm -lpthread -lrt:这些是 OpenCV 私有的链接库,可能不直接用于 OpenCV 的功能,但是 OpenCV 的某些功能可能依赖于这些库。例如,-ldl 链接动态链接库,-lm 链接数学库,-lpthread 链接 POSIX 线程库,-lrt 链接实时库。
    • Cflags: -I${includedir}:编译时需要的标志。-I 指定头文件搜索路径,这里指定了头文件所在的目录。
  5. 执行指令sudo nano /etc/bash.bashrc打开bash的配置文件并编辑,在文件中添加两行内容:PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfigexport PKG_CONFIG_PATH
    在这里插入图片描述

    • PKG_CONFIG_PATH 是一个环境变量,用于指定 pkg-config 工具搜索 .pc 配置文件的路径。pkg-config 是一个帮助程序,用于在编译和链接时查找库的编译和链接标志。
    • /etc/bash.bashrc和~/.bashrc的区别:
      • 前者是一个全局的 Bash 配置文件,存在于系统级别。当任何用户以交互式方式登录系统时(无论是通过终端还是远程登录),Bash 都会读取这个文件。
      • 后者是一个用户的 Bash 配置文件,存在于用户的主目录中(即用户的 home 目录)。这个文件通常用于设置用户特定的环境变量、别名和函数,这些设置只对文件所有者的用户生效。
  6. 执行指令source /etc/bash.bashrc使配置文件生效。

  7. 执行指令pkg-config opencv --modversion查看是否安装成功。
    在这里插入图片描述

2 编写cpp文件检验安装是否成功

执行下图中的指令,若出现图示结果说明安装成功。其中test.cpp和CMakeLists.txt文件的内容见下文。
在这里插入图片描述

  • test.cpp文件:
    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    int main() {
          
          
        // 打印OpenCV版本
        std::cout << "OpenCV version: " << CV_VERSION << std::endl;
    
        // 检查OpenCV模块是否加载成功
        try {
          
          
            // 尝试加载OpenCV模块
            cv::Mat testMat = cv::Mat::eye(3, 3, CV_64F);
            std::cout << "OpenCV is installed and working properly." << std::endl;
        } catch (const std::exception& e) {
          
          
            std::cerr << "OpenCV installation or usage issue: " << e.what() << std::endl;
        }
    
        return 0;
    }
    
  • CMakeLists.txt:
    cmake_minimum_required(VERSION 2.8)
    project( test )
    find_package( OpenCV REQUIRED )
    add_executable( test test.cpp )
    target_link_libraries( test ${OpenCV_LIBS} )