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文件,网络直连不稳定的话,容易枯燥等待,出现问题。

-
直接手动下载文件
-
IPPICV文件 :
https://raw.githubusercontent.com/opencv/opencv_3rdparty/0cc4aa06bf2bef4b05d237c69a5a96b9cd0cb85a/ippicv/ippicv_2021.10.0_lnx_intel64_20230919_general.tgz -
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 命令查看该文件,在 ippicv 和 ade 相关的下载失败条目附近,你会看到类似 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 版本。
-
检查版本号:
bashopencv_version如果输出
4.9.0,则基础安装成功。 -
验证 pkg-config(重要,关系到你自己写程序时能否正确链接):
bashpkg-config --modversion opencv4同样应该输出
4.9.0。 -
验证 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 这个强制工具。
-
安装proxychains:
bashsudo apt update sudo apt install proxychains4 -
配置proxychains :编辑其配置文件(通常位于
/etc/proxychains4.conf或~/.proxychains/proxychains.conf)。bashsudo vim /etc/proxychains4.conf在文件末尾找到
[ProxyList]部分,添加你的SOCKS5代理(ip为主机ipconfig 无线网卡的ipv4, 端口号看自身实际情况):[ProxyList] socks5 127.0.0.1 7890 -
通过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. 对局结算画面
祝大家一同顺顺利利~
