Ubuntu虚拟机编译安装部分OpenCV模块方法实现——保姆级教程
Ubuntu虚拟机的安装过程可以查看另一篇文章:VMware安装Ubuntu虚拟机实现C++OpenCV代码在虚拟机下运行教程-CSDN博客
目前我们已经下载好了OpenCV,这里以OpenCV4.5.2为例。
在内存要求尽可能小的情况下,可以尝试只编译安装代码中使用到的OpenCV模块,以压缩OpenCV占用的内存容量,但是由于OpenCV库中很多函数是具备依赖关系的,可能出现编译后缺少某些模块的情况,这里给出一个编译安装部分模块的实现方法。

这是编译安装部分模块之后OpenCV占用情况,可以看到共占用内存317.9MB,相比整个编译安装小了一倍多。
具体方法如下:
1. 梳理出代码中使用到的OpenCV函数
在我的图像处理三维解算代码中使用到了如下函数:
const cv::Mat& frame1, const cv::Mat& frame2、cv::split(img, channels)、cv::subtract(img1, img2, diff)、cv::threshold(src, dst, threshold, 255, cv::THRESH_BINARY)、cv::morphologyEx(img, img, cv::MORPH_OPEN, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5)))、
cv::erode(img, img, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)))、cv::dilate(img, img, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5)))、cv::resize(img, img, cv::Size(), scale, scale)、cv::findContours(binImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE)、cv::Point2f bestCenter(0, 0)、cv::contourArea(contour)、cv::arcLength(contour, true)、cv::RotatedRect ellipse = cv::fitEllipse(contour)、cv::moments(contour)、cv::cvtColor(binImg, gray, cv::COLOR_BGR2GRAY)、cv::cornerSubPix(gray, refinedPts, cv::Size(5, 5), cv::Size(-1, -1), criteria)、cv::triangulatePoints(T1, T2, pts1, pts2, pts4d)、cv::Mat::eye(4, 4, CV_64F)、cv::Mat::copyTo、cv::Mat::at、cv::Mat、cv::Point2f、cv::Point3f
注意,需要将使用到的OpenCV数据类型一并摘出,这些数据结构涉及到OpenCV的核心模块core。一般情况下,核心模块是必不可少的,总是会或多或少使用到OpenCV中定义的数据结构。
2. 划分调用的OpenCV函数涉及的OpenCV模块
(1)核心模块 (core)
- 数据结构和基本类型:cv::Mat、cv::Point、cv::Point2f、cv::Point3f 等基础数据结构,这些都是由 core 模块 提供的。
- 基本数学运算与矩阵操作:点与矩阵的乘法、旋转矩阵的构建及复制等都归功于 core 模块。
(2)图像处理模块 (imgproc)
- 通道分离与阈值处理:cv::split、cv::threshold、cv::subtract 等函数对图像进行预处理,归属于 imgproc 模块。
- 形态学处理:代码中的 cv::morphologyEx、cv::erode、cv::dilate 用于图像的噪点去除、形态学开运算等操作,也属于 imgproc。
- 几何变换与轮廓处理:图像的缩放(cv::resize)、轮廓检测(cv::findContours)、轮廓的面积、周长计算(cv::contourArea、cv::arcLength)、拟合椭圆(cv::fitEllipse)、矩计算(cv::moments)、亚像素级的角点检测(cv::cornerSubPix)等均由 imgproc 模块提供。
- 颜色空间转换:在检测亚像素位置时,使用cv::cvtColor,这是 imgproc 模块的另一常用功能。
(3)相机标定与三角测量模块 (calib3d)
- 三角测量:函数 cv::triangulatePoints 归属于 calib3d 模块,用于将二维像素点转换成三维点云,这部分功能归入 OpenCV 的相机标定与三维重建领域。
需要注意的是,calib3d模块对 opencv_flann 是存在依赖关系的,因此在后续的操作中不能禁用 opencv_flann。
3. 编译安装
想要尽可能降低内存占用,可以禁用不使用的模块。
① 解压OpenCV4.5.2
在OpenCV所在路径下打开终端输入:
unzip opencv-4.5.2.zip
② 创建build文件夹
cd到刚才解压之后的OpenCV文件夹下:
cd opencv-4.5.2
然后创建build文件夹并cd到build
mkdir build && cd build
③ cmake
设置要编译的模块和禁用模块。
cmake -D CMAKE_BUILD_TYPE=RELEASE \-D BUILD_SHARED_LIBS=ON \-D BUILD_opencv_core=ON \-D BUILD_opencv_imgproc=ON \-D BUILD_opencv_features2d=ON \-D BUILD_opencv_calib3d=ON \-D BUILD_opencv_imgcodecs=ON \-D WITH_JPEG=OFF \-D WITH_PNG=OFF \-D BUILD_opencv_highgui=OFF \-D BUILD_opencv_videoio=OFF \-D BUILD_opencv_photo=OFF \-D BUILD_opencv_video=OFF \-D BUILD_opencv_ml=OFF \-D BUILD_opencv_python=OFF \-D BUILD_EXAMPLES=OFF \-D BUILD_TESTS=OFF \-D BUILD_PERF_TESTS=OFF \-D WITH_TIFF=OFF \-D WITH_WEBP=OFF \-D WITH_OPENCL=OFF \-D WITH_CUDA=OFF \-D WITH_GTK=OFF \..
左边部分:设置各种构建选项(比如启用/禁用模块、选择编译类型、关闭不需要的依赖库等)。
右边部分:指定源码目录的路径,这里使用的是 .. 表示上级目录(即源码目录)。
编译后的库文件的内存占用与实际运行时加载占用通常会比全部模块编译时少很多。通过只编译必需模块,能够有效降低内存峰值。
④ 编译安装
Make -j$(nproc)
sudo make install


这样就编译安装成功了。
4. 编译运行程序代码
在你的代码所在文件夹下打开终端,并依次键入如下命令,即可编译运行:
mkdir build && cd build
cmake ..
make
./imgProc
注: ./imgProc 是我的代码工程的名字,需要修改成你的工程名。


运行成功的界面如上图所示。
代码对应CMakeLists.txt格式如下:

cmake_minimum_required(VERSION 3.10)
project(imgProc)# 强制使用 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找 OpenCV 并指定版本和模块
find_package(OpenCV 4.5.2 REQUIRED)# 包含头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include # 使用绝对路径指定头文件目录${OpenCV_INCLUDE_DIRS}
)# 添加可执行文件
add_executable(imgProc src/Host.cpp src/imgProc.cpp)# 链接 OpenCV 库
# target_link_libraries(imgProc PRIVATE ${OpenCV_LIBS})
target_link_libraries(imgProc PRIVATE ${OpenCV_LIBS} opencv_calib3d opencv_imgcodecs)
5. 遇到的问题
在编译运行代码的过程中可能会遇到报错,下面是我在编译运行中遇到的问题:
zhouzhou@ubuntu:~/imgProc/build$ cmake .. -- The C compiler identification is GNU 9.4.0 -- The CXX compiler identification is GNU 9.4.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done CMake Error at /usr/share/cmake-4.0/Modules/FindPackageHandleStandardArgs.cmake:227 (message): Could NOT find OpenCV (missing: calib3d imgcodecs) (found suitable version "4.5.2", minimum required is "4.5.2") Call Stack (most recent call first): /usr/share/cmake-4.0/Modules/FindPackageHandleStandardArgs.cmake:591 (_FPHSA_FAILURE_MESSAGE) /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake:354 (find_package_handle_standard_args) CMakeLists.txt:9 (find_package) -- Configuring incomplete, errors occurred!
这个报错的原因是 CMake 和 OpenCV 升级了,但错误日志显示 CMake 仍在调用旧版本路径 /usr/share/cmake-4.0/Modules,表明 系统未正确切换到新安装的 CMake。同时,OpenCVConfig.cmake 可能未正确导出 calib3d 和 imgcodecs 模块的依赖。
# 卸载旧版 CMake
sudo apt remove cmake # 移除系统包管理器安装的旧版本
sudo rm -rf /usr/share/cmake* # 清理残留文件 :ml-citation{ref="4,6" data="citationList"}# 下载 CMake 3.28
wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.sh# 安装 CMake 3.28
chmod +x cmake-3.28.3-linux-x86_64.sh # 赋予执行权限
sudo ./cmake-3.28.3-linux-x86_64.sh --prefix=/usr/local --exclude-subdir # 安装到系统路径 :ml-citation{ref="2,6" data="citationList"}# 更新环境变量
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc # 将 CMake 路径加入环境变量
source ~/.bashrc # 立即生效 :ml-citation{ref="4" data="citationList"}# 验证版本
cmake --version # 应输出 3.28.3
如果 wget 下载失败(一般是网络问题),可改用 curl 或浏览器手动下载后上传到服务器:
curl -O https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.sh
检查 OpenCV 是否包含 calib3d 和 imgcodecs:
# 检查头文件
ls /usr/local/include/opencv4/opencv2/calib3d.hpp
ls /usr/local/include/opencv4/opencv2/imgcodecs.hpp# 检查库文件
ls /usr/local/lib/libopencv_calib3d*
ls /usr/local/lib/libopencv_imgcodecs*
如果经过上述安装cmake命令之后还是报错,应该是因为g++ gcc的版本太高了导致的不适配,应该降低g++ gcc的版本,之前是因为代码使用的C++ 23标准,升级了g++ gcc版本为13.1.0,目前不能适用,需要手动降低其版本来解决。
由于我之前设置了g++ gcc 13.1.0版本的优先级是60,重新安装9.4.0版本默认使用的还是13.1.0版本,需要将9.4.0版本的优先级设置的更大,这里设置为80:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 80
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 80
# 配置 gcc
sudo update-alternatives --config gcc
# 配置 g++
sudo update-alternatives --config g++
安装成功之后输入:
gcc --version # 应输出 9.4.0
g++ --version # 应输出 9.4.0


这样再重新编译运行即可成功。
相关文章:
Ubuntu虚拟机编译安装部分OpenCV模块方法实现——保姆级教程
Ubuntu虚拟机的安装过程可以查看另一篇文章:VMware安装Ubuntu虚拟机实现COpenCV代码在虚拟机下运行教程-CSDN博客 目前我们已经下载好了OpenCV,这里以OpenCV4.5.2为例。 在内存要求尽可能小的情况下,可以尝试只编译安装代码中使用到的OpenC…...
find指令中使用正则表达式
linux查找命令能结合正则表达式吗 find命令要使用正则表达式需要结合-regex参数 另,-type参数可以指定查找类型(f为文件,d为文件夹) rootlocalhost:~/regular_expression# ls -alh 总计 8.0K drwxr-xr-x. 5 root root 66 4月 8日 16:26 . dr-xr-…...
Java Web从入门到精通:全面探索与实战(二)
Java Web从入门到精通:全面探索与实战(一)-CSDN博客 目录 四、Java Web 开发中的数据库操作:以 MySQL 为例 4.1 MySQL 数据库基础操作 4.2 JDBC 技术深度解析 4.3 数据库连接池的应用 五、Java Web 中的会话技术ÿ…...
基于大模型的阵发性室上性心动过速风险预测与治疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与数据来源 二、阵发性室上性心动过速概述 2.1 定义与分类 2.2 发病机制与流行病学 2.3 临床表现与诊断方法 三、大模型在阵发性室上性心动过速预测中的应用 3.1 大模型技术原理与特点 3.2 模型构…...
秒杀业务的实现过程
一.后台创建秒杀的活动场次信息,并关联到要秒杀的商品或服务; 二.通过定时任务,将秒杀的活动信息和商品服务信息存储到redis; 三.在商品展示页的显眼位置加载秒杀活动信息; 四.用户参与秒杀,创建订单,将…...
spring mvc @ResponseBody 注解转换为 JSON 的原理与实现详解
ResponseBody 注解转换为 JSON 的原理与实现详解 1. 核心作用 ResponseBody 是 Spring MVC 的一个注解,用于将方法返回的对象直接序列化为 HTTP 响应体(如 JSON 或 XML),而不是通过视图解析器渲染为视图(如 HTML&…...
TDengine.C/C++ 连接器
简介 C/C 开发人员可以使用 TDengine 的客户端驱动,即 C/C 连接器(以下都用 TDengine 客户端驱动表示),开发自己的应用来连接 TDengine 集群完成数据存储、查询以及其他功能。TDengine 客户端驱动的 API 类似于 MySQL 的 C API。…...
[docker] 简单操作场景
Docker的简单操作场景 1 安装 暂时没空写~ 2 登陆 一共4步: ~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d765d4c1eb5f ubuntu:24.04 "/bin/bash" …...
skynet.rawcall使用详解及应用场景
目录 核心特性函数原型使用场景场景 1:高性能二进制传输(如文件转发)场景 2:自定义序列化协议(如 Protocol Buffers)场景 3:跨服务共享内存(避免拷贝) 配套接收方实现与 …...
使用SpringSecurity下,发生重定向异常
使用SpringSecurity下,发生空转异常 环境信息: Spring Boot 3.4.4 , jdk 17 , springSecurity 6.4.4 问题背景: 没有自定义controller ,改写了login 页面,并且进行了成功后的跳转处理…...
gbase8s之逻辑导出导入脚本(完美版本)
该脚本dbexport.sh用于快速导出库和导入库(使用多并发unload,和多并发dbload的方式) #!/bin/sh #脚本功能:将数据导出成文本,迁移至其他实例 #最后更新时间:2023-12-19 #使用方法: #1.执行该脚…...
Elasticsearch | ES索引模板、索引和索引别名的创建与管理
关注:CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时,索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名,并提供具…...
【Easylive】视频删除方法详解:重点分析异步线程池使用
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 方法整体功能 这个deleteVideo方法是一个综合性的视频删除操作,主要完成以下功能: 权限验证:检查视频是否存在及用户是否有权限删除核心数据删除&…...
力扣hot100_回溯(2)_python版本
一、39. 组合总和(中等) 代码: class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…...
SGLang实战:从KV缓存复用到底层优化,解锁大模型高效推理的全栈方案
在当今快速发展的人工智能领域,大型语言模型(LLM)的应用已从简单对话扩展到需要复杂逻辑控制、多轮交互和结构化输出的高级任务。面对这一趋势,如何高效地微调并部署这些大模型成为开发者面临的核心挑战。本文将深入探讨SGLang——这一专为大模型设计的高…...
LPDDR4内存颗粒命名规则全解析:三星、镁光、海力士、南亚、长鑫等厂商型号解码与选型指南
由于之前DDR的系列选型文章有很好的反馈,所以补充LPDDR4低功耗内存的选型和命名规则,总结了目前市面上常用的内存,供硬件工程师及数码爱好者参考。 在智能手机、平板电脑和低功耗设备中,LPDDR4 SDRAM凭借其高带宽、低功耗特性成为…...
特权FPGA之Johnson移位
完整代码: module johnson(clk,rst_n,led,sw1_n,sw2_n,sw3_n);input clk; //时钟信号,50MHz input rst_n; //复位信号,低电平有效 output[3:0] led; //LED控制,1--灭…...
网络安全小知识课堂(最终完结版)
网络安全入门 :从 “小白” 到 “守护者” 的蜕变之旅 写在完结之际 历经 13 篇的深度探索,我们从 DDoS 攻击的 “流量洪水” 一路闯关到 HTTPS 的 “加密堡垒”,揭开了网络安全世界的层层面纱。感谢每一位读者的陪伴与互动,你们…...
2025年AI生成引擎搜索发展现状与趋势总结
2025年AI生成引擎搜索发展现状与趋势总结 一、国内外AI生成引擎搜索发展现状 1. 国内动态 社交搜索崛起:小红书2024年Q4日均搜索量达6亿次,用户更依赖社交平台UGC内容进行决策(如购物、旅游场景)&#…...
【杂谈】Godot4.4导出到Android平台(正式导出)
学博而后可约,事历而后知要。 目录 一、准备二、Gradle构建三、配置Java SDK四、配置Android SDK五、配置密钥 一、准备 本文在前文【杂谈】Godot4.4导出到安卓平台(调试导出)的基础上,进行正式导出。调试导出并不是真正的编译导…...
VBA将Word文档内容逐行写入Excel
如果你需要将Word文档的内容导入Excel工作表来进行数据加工,使用下面的代码可以实现: Sub ImportWordToExcel()Dim wordApp As Word.ApplicationDim wordDoc As Word.DocumentDim excelSheet As WorksheetDim filePath As VariantDim i As LongDim para…...
基于AI设计开发出来的业务系统是什么样的?没有菜单?没有表格?
基于AI设计开发出的业务系统仍然会包含菜单、表格等传统UI元素,但AI技术会显著改变它们的实现方式和交互逻辑。以下是具体分析: 一、传统元素的持续存在 功能刚需性 • 菜单承担着系统导航的核心功能,表格则是结构化数据展示的基础载体。根…...
C++ -异常之除以 0 问题(整数除以 0 编译时检测、整数除以 0 运行时检测、浮点数除以 0 编译时检测、浮点数除以 0 运行时检测)
一、整数除以 0(编译时检测) 1、演示 #include <iostream>using namespace std;int main() {int result 10 / 0;cout << result << endl;return 0; }程序无法运行,输出结果 error C2124: 被零除或对零求模2、演示解读 …...
数字足迹管理(DFM):你的网络隐身指南
数字足迹管理(DFM):你的网络隐身指南 你可能不知道,你的姓名、电话、住址正在网上被“明码标价” ——而这一切,可能只是因为你点过外卖、寄过快递,甚至注册过一个网站。 一、什么是数字足迹管理&#…...
如何避免“过度承诺”导致的验收失败
如何避免“过度承诺”导致的验收失败?关键在于: 评估可行性、设置合理目标、高频沟通反馈、阶段性验收、做好风险管理。其中设置合理目标至关重要,很多团队往往在项目初期为迎合客户或领导而报出“最理想方案”,忽略了资源、技术及…...
MySQL学习笔记集--游标
游标 在MySQL中,游标(Cursor)是一种数据库对象,它允许您逐行处理查询结果集。游标通常与存储过程一起使用,因为它们需要在存储过程或函数中声明和操作。游标的使用涉及几个步骤:声明游标、打开游标、从游标…...
紧跟数字人热潮:123 数字人分身克隆系统源码部署与风口洞察
在当今数字化浪潮中,数字人技术无疑已成为最具活力与潜力的领域之一,正以迅猛之势席卷多个行业,重塑着人们的交互方式与商业运作模式。C 站作为技术交流的前沿阵地,汇聚了众多关注前沿科技的开发者与技术爱好者,今天来…...
QT控件 修改QtTreePropertyBrowser自定义属性编辑器源码,添加第一列标题勾选,按钮,右键菜单事件等功能
头阵子遇到一个需要修改QtTreePropertyBrowser控件的需求,QT开发做这么久了,这个控件倒是第一次用,费了点时间研究,在这里做个简单的总结。 QtTreePropertyBrowser控件 是 Qt 解决方案 (Qt Solutions) 中的一个组件,用…...
Excel 日期值转换问题解析
目录 问题原因 解决方案 方法1:使用 DateTime.FromOADate 转换 方法2:处理可能为字符串的情况 方法3:使用 ExcelDataReader 时的处理 额外提示 当你在 Excel 单元格中看到 2024/12/1,但 C# 读取到 45627 时,这是…...
0. 七小时挑战:自研企业级任务调度器--前言
在软件开发的世界里,有一个亘古不变的问题:“为什么不直接用现成的?”这句话听起来合理、理性、务实,甚至有点老道。毕竟,时间宝贵、预算有限,轮子已经造好了,何必再动手? 但有时候…...
