Ubuntu升级opencv版本至4.9.0

Ubuntu22.04源码编译方式升级opencv版本至4.9.0

文章目录

  • Ubuntu22.04源码编译方式升级opencv版本至4.9.0
    • [0. 遇到的坑](#0. 遇到的坑)
    • [1. 清理旧的头文件和链接](#1. 清理旧的头文件和链接)
    • [2. 安装编译依赖](#2. 安装编译依赖)
    • [3. 下载 OpenCV 4.9.0 源代码](#3. 下载 OpenCV 4.9.0 源代码)
    • [4. 使用 CMake 配置编译选项](#4. 使用 CMake 配置编译选项)
      • [4.1 **需要注意的坑与处理方案:**](#4.1 需要注意的坑与处理方案:)
    • [5. 编译源代码](#5. 编译源代码)
    • [6. 安装到系统](#6. 安装到系统)
    • [7. 更新系统库缓存](#7. 更新系统库缓存)
    • [8. 验证安装](#8. 验证安装)
    • [9. Qt工程pro文件引入opencv](#9. Qt工程pro文件引入opencv)
    • [10. 关于proxychains](#10. 关于proxychains)
    • [11. 对局结算画面](#11. 对局结算画面)

由于项目需要,Ubuntu Jammy(22.04 LTS)的官方仓库的OpenCV4.5.4版本太旧了,DNN模块存在不少问题。无法满足通过OpenCV 4.8以上版本DNN模块使用YOLOv8 pt转换到ONNX模型的需求。权衡利弊之下,干脆选择升级到4.9.0版本。记录一下升级遇到的坑。

0. 遇到的坑

个人使用的环境,是安装在VM虚拟机中。终端下载github相关内容时,若不想倒腾虚拟机环境下的魔法代理,建议先在主机下载好相关内容。过程中遇到的会有opencv4.9.0源码文件,cmake指令中涉及的中间文件下载。

由于大部分代理是走的socks,可以倒腾一下安装proxychains工具,无论是桥接还是NAT模式,在虚拟机环境网络连接设置里面,添加手动模式的代理后,在终端中相关指令前,用proxychains4开头,即可。

1. 清理旧的头文件和链接

为了避免编译时新旧版本头文件冲突,首先卸载旧的开发包。这个操作通常不会移除其他程序依赖的核心运行库

bash 复制代码
sudo apt remove --purge libopencv-dev

这删除了头文件(*.h)和静态库链接(*.a),但系统关键的动态库(如 libopencv_core.so.4.5)仍然保留。

2. 安装编译依赖

安装后续编译OpenCV所必需的工具和库:

bash 复制代码
sudo apt update
sudo apt install -y build-essential cmake git pkg-config
sudo apt install -y libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install -y libjpeg-dev libpng-dev libtiff-dev libopenexr-dev
sudo apt install -y python3-dev python3-numpy

3. 下载 OpenCV 4.9.0 源代码

  • 建议在 /opt 目录下操作,方便管理。
  • 建议在主机或者开启代理方便的环境下,下载好需要的zip文件,跳过终端wget下载的步骤。
bash 复制代码
# 进入 /opt 目录
cd /opt

# 下载 OpenCV 4.9.0 源代码压缩包
sudo wget -O opencv.zip https://github.com/opencv/opencv/archive/refs/tags/4.9.0.zip

# 下载 OpenCV Contrib 模块的源代码(包含DNN等更多功能)
sudo wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/refs/tags/4.9.0.zip

# 解压两个压缩包
sudo unzip opencv.zip
sudo unzip opencv_contrib.zip

# 重命名目录,方便识别(可选)
sudo mv opencv-4.9.0 opencv
sudo mv opencv_contrib-4.9.0 opencv_contrib

4. 使用 CMake 配置编译选项

这是最核心的一步,我们创建一个构建目录并进行配置。特别注意下面 cmake 命令中的 -D OPENCV_EXTRA_MODULES_PATH 参数,它指定了 Contrib 模块的路径,这对 DNN 等高级功能很重要。

bash 复制代码
# 进入解压后的OpenCV目录
cd /opt/opencv

# 创建一个独立的构建目录,并进入
mkdir build && cd build

# 运行 CMake 进行配置。以下是一个兼顾功能和稳定性的基础配置:
# 请将 `/opt/opencv_contrib/modules` 替换为你实际解压的 contrib 目录路径
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
           -D CMAKE_INSTALL_PREFIX=/usr/local \
           -D OPENCV_GENERATE_PKGCONFIG=ON \
           -D OPENCV_EXTRA_MODULES_PATH=/opt/opencv_contrib/modules \
           -D BUILD_EXAMPLES=OFF \
           -D WITH_FFMPEG=ON \
           -D WITH_GTK=ON \
           -D BUILD_opencv_python3=ON \
           -D OPENCV_ENABLE_NONFREE=OFF \
           ..

配置参数说明:

  • -D CMAKE_INSTALL_PREFIX=/usr/local:指定安装路径为系统目录。
  • -D OPENCV_GENERATE_PKGCONFIG=ON:生成 pkg-config 文件,极大方便后续自己开发项目时链接 OpenCV。
  • -D OPENCV_EXTRA_MODULES_PATH=...非常重要,指向 contrib 模块目录,确保编译进额外的 DNN 等功能。
  • BUILD_EXAMPLES=OFF:不编译例子,加快速度。
  • WITH_CUDA=OFF:默认不启用 CUDA。如果你有 Nvidia GPU 并已安装好 CUDA 驱动和工具包,可以将其改为 ON 以加速 DNN 推理。

执行顺利完成后,如图所示:

4.1 需要注意的坑与处理方案:

  • 未开启代理的话,cmake指令运行过程中,会尝试下载ippicv和ade文件,网络直连不稳定的话,容易枯燥等待,出现问题。
  • 直接手动下载文件

    1. IPPICV文件https://raw.githubusercontent.com/opencv/opencv_3rdparty/0cc4aa06bf2bef4b05d237c69a5a96b9cd0cb85a/ippicv/ippicv_2021.10.0_lnx_intel64_20230919_general.tgz

    2. ADE文件https://github.com/opencv/ade/archive/v0.1.2d.zip

  • 将文件放置到OpenCV的缓存目录

打开终端,执行以下命令。请将 /path/to/your/Downloads/ 替换为你浏览器下载文件的实际路径 (例如 /root/Downloads/)。

bash 复制代码
# 1. 创建OpenCV的缓存目录(如果不存在)
sudo mkdir -p /opt/opencv/.cache/ippicv
sudo mkdir -p /opt/opencv/.cache/ade

# 2. 复制IPPICV文件到缓存,并重命名为CMake要求的格式(以MD5校验码开头)
#    注意:下面的MD5码(b7cc5b)是OpenCV 4.9.0要求的,请务必保持一致。
sudo cp /path/to/your/Downloads/ippicv_2021.10.0_lnx_intel64_20230919_general.tgz /opt/opencv/.cache/ippicv/b7cc5b1062eaa7a8d4f6c0c4c5b7b6c5-ippicv_2021.10.0_lnx_intel64_20230919_general.tgz

# 3. 复制ADE文件到缓存,同样需要重命名
#    ADE文件要求的MD5码是 a8d4f6c0c4c5b7b6c5...
sudo cp /path/to/your/Downloads/ade-0.1.2d.zip /opt/opencv/.cache/ade/3a4e4b5b5c5d6e7f8a9b0c1d2e3f4g5h-v0.1.2d.zip

重要提示 :上面命令中的 b7cc5b1062...3a4e4b5b5c... 是占位符,你需要从 /opt/opencv/build/CMakeDownloadLog.txt 日志文件中找到正确的MD5码。使用 cat 命令查看该文件,在 ippicvade 相关的下载失败条目附近,你会看到类似 expected_md5=xxxxxx 的信息,那就是正确的值。替换上述命令中的占位符即可。

  • 清理并重新运行CMake

放置文件后,建议先清除之前的构建缓存,再重新配置:

bash 复制代码
# 删除之前的CMake缓存
cd /opt/opencv/build
sudo rm -rf *
# 重新运行CMake配置命令
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D OPENCV_GENERATE_PKGCONFIG=ON \
      -D OPENCV_EXTRA_MODULES_PATH=/opt/opencv_contrib/modules \
      -D BUILD_EXAMPLES=OFF \
      -D WITH_FFMPEG=ON \
      -D WITH_GTK=ON \
      -D BUILD_opencv_python3=ON \
      -D OPENCV_ENABLE_NONFREE=OFF \
      ..

如果操作正确,这次CMake将直接从本地缓存找到文件,不需要等待多久就会通过下载步骤,并开始检查其他依赖。

5. 编译源代码

使用 make 命令开始编译。-j$(nproc) 选项会使用你电脑所有可用的 CPU 核心来并行编译,能显著缩短时间。

bash 复制代码
# 开始编译,利用所有CPU核心。这个过程需要些时间,请耐心等待。
sudo make -j$(nproc)

注意 :如果编译过程中报错停止,通常是缺少某个依赖库。请仔细阅读错误信息(通常是最后几行),它会提示缺少哪个 libxxx-dev 包。可尝试使用 sudo apt install libxxx-dev 安装后,重新执行 sudo make -j$(nproc) 。博主本人自这一步骤开始就很顺利。

6. 安装到系统

编译成功后,将编译好的库文件、头文件等安装到第四步指定的 /usr/local 目录。

bash 复制代码
sudo make install

7. 更新系统库缓存

安装后,需要更新系统的动态链接库缓存,让系统和编译器能找到新安装的 OpenCV。

bash 复制代码
sudo ldconfig

8. 验证安装

现在来验证安装是否成功,并且是 4.9.0 版本。

  1. 检查版本号

    bash 复制代码
    opencv_version

    如果输出 4.9.0,则基础安装成功。

  2. 验证 pkg-config(重要,关系到你自己写程序时能否正确链接):

    bash 复制代码
    pkg-config --modversion opencv4

    同样应该输出 4.9.0

  3. 验证 DNN 模块是否能加载你的 ONNX 模型。

    创建一个简单的C++测试程序,例如 test_onnx.cpp

c++ 复制代码
#include <opencv2/dnn.hpp>
#include <opencv2/core.hpp>
#include <iostream>

int main() {
    // 尝试加载你的YOLOv8 ONNX模型,请将路径替换为你的实际模型路径
    cv::dnn::Net net = cv::dnn::readNet("/path/to/your/yolov8n.onnx");
    if(net.empty()) {
        std::cerr << "错误: 无法加载ONNX模型!请检查路径。" << std::endl;
        return -1;
    } else {
        std::cout << "成功: ONNX模型加载成功!" << std::endl;
        // 可以进一步打印网络层信息
        std::vector<std::string> layerNames = net.getLayerNames();
        std::cout << "网络包含 " << layerNames.size() << " 层。" << std::endl;
    }
    return 0;
}

9. Qt工程pro文件引入opencv

ini 复制代码
# OpenCV:使用 pkg-config 自动获取 4.9.0 版本的正确配置
CONFIG += link_pkgconfig
PKGCONFIG += opencv4

OCV_CFLAGS = $$system(pkg-config --cflags opencv4 2>/dev/null)
OCV_LIBS = $$system(pkg-config --libs opencv4 2>/dev/null)

!isEmpty(OCV_CFLAGS) {
    OCV_LIBS_LIST = $$split(OCV_LIBS, " ")

    # 初始化一个空变量用于标记
    FOUND_DNN_FLAG =

    for(lib, OCV_LIBS_LIST) {
        # 匹配包含 "dnn" 的项
        contains(lib, ".*-lopencv_dnn$") { # 这里的 $ 表示以 dnn 结尾,精确匹配 -lopencv_dnn
            message("[FOUND] 匹配到核心库: $$lib")
            FOUND_DNN_FLAG = yes
        } else {
            contains(lib, ".*dnn.*"): message("[FOUND] 匹配到扩展库: $$lib")
        }
    }

    !isEmpty(FOUND_DNN_FLAG) {
        message("[SUCCESS] pkg-config 验证通过,包含核心 dnn 库。")
    } else {
        message("[WARNING] 未在链接参数中显式找到核心 -lopencv_dnn 库。")
    }
} else {
    message("[WARNING] pkg-config 未生效,启用备用方案...")
    INCLUDEPATH += /usr/local/include/opencv4
    LIBS += -L/usr/local/lib -lopencv_core -lopencv_dnn
}

10. 关于proxychains

SOCKS代理和HTTP/HTTPS代理是不同的协议 ,所以一些代理教程设置的 http_proxy 环境变量对SOCKS代理无效。可以使用 proxychains 这个强制工具。

  1. 安装proxychains

    bash 复制代码
    sudo apt update
    sudo apt install proxychains4
  2. 配置proxychains :编辑其配置文件(通常位于 /etc/proxychains4.conf~/.proxychains/proxychains.conf)。

    bash 复制代码
    sudo vim /etc/proxychains4.conf

    在文件末尾找到 [ProxyList] 部分,添加你的SOCKS5代理(ip为主机ipconfig 无线网卡的ipv4, 端口号看自身实际情况):

    复制代码
    [ProxyList]
    socks5 127.0.0.1 7890
  3. 通过proxychains运行CMake

    bash 复制代码
    # 先确保权限,然后使用proxychains前缀
    proxychains4 cmake -D CMAKE_BUILD_TYPE=RELEASE \
          -D CMAKE_INSTALL_PREFIX=/usr/local \
          -D OPENCV_GENERATE_PKGCONFIG=ON \
          -D OPENCV_EXTRA_MODULES_PATH=/opt/opencv_contrib/modules \
          -D BUILD_EXAMPLES=OFF \
          -D WITH_FFMPEG=ON \
          -D WITH_GTK=ON \
          -D BUILD_opencv_python3=ON \
          -D OPENCV_ENABLE_NONFREE=OFF \
          ..

    proxychains 会输出 [proxychains] config file found: ...[proxychains] preloading ... 等提示,表示正在通过代理运行。

11. 对局结算画面

祝大家一同顺顺利利~

相关推荐
默|笙2 小时前
【Linux】进程(6)虚拟地址空间
linux·运维·服务器
linzihahaha2 小时前
vmware-ubuntu 虚拟机共享文件及复制拖动配置
linux·运维·ubuntu
Jerryhut2 小时前
Opencv总结1——视频读取与处理,图像阈值和平滑处理,图像形态学操作
人工智能·opencv·计算机视觉
韩金群2 小时前
centos离线安装配置clickhouse
linux·clickhouse·centos
HIT_Weston2 小时前
70、【Ubuntu】【Hugo】搭建私人博客:新建站点
linux·运维·ubuntu
Danileaf_Guo2 小时前
让Ubuntu服务器变身OSPF路由器!实现服务器与网络设备直接对话
linux·运维·服务器·ubuntu
asdzx672 小时前
使用 C# 高质量实现 Word 转 Excel:完整保留文本、表格与样式
经验分享
HalvmånEver2 小时前
Linux:库制作与原理(三)
linux·运维·服务器
管理大亨2 小时前
Linux服务器性能优化全攻略
linux·服务器·性能优化