Ubuntu虚拟机编译安装部分OpenCV模块方法实现——保姆级教程

news2025/4/12 15:02:41

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 

这样再重新编译运行即可成功。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2330961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring mvc @ResponseBody 注解转换为 JSON 的原理与实现详解

ResponseBody 注解转换为 JSON 的原理与实现详解 1. 核心作用 ResponseBody 是 Spring MVC 的一个注解,用于将方法返回的对象直接序列化为 HTTP 响应体(如 JSON 或 XML),而不是通过视图解析器渲染为视图(如 HTML&…

skynet.rawcall使用详解及应用场景

目录 核心特性函数原型使用场景场景 1:高性能二进制传输(如文件转发)场景 2:自定义序列化协议(如 Protocol Buffers)场景 3:跨服务共享内存(避免拷贝) 配套接收方实现与 …

使用SpringSecurity下,发生重定向异常

使用SpringSecurity下,发生空转异常 环境信息: Spring Boot 3.4.4 , jdk 17 , springSecurity 6.4.4 问题背景: 没有自定义controller ,改写了login 页面,并且进行了成功后的跳转处理&#xf…

Elasticsearch | ES索引模板、索引和索引别名的创建与管理

关注:CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时,索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名,并提供具…

力扣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…

LPDDR4内存颗粒命名规则全解析:三星、镁光、海力士、南亚、长鑫等厂商型号解码与选型指南

由于之前DDR的系列选型文章有很好的反馈,所以补充LPDDR4低功耗内存的选型和命名规则,总结了目前市面上常用的内存,供硬件工程师及数码爱好者参考。 在智能手机、平板电脑和低功耗设备中,LPDDR4 SDRAM凭借其高带宽、低功耗特性成为…

【杂谈】Godot4.4导出到Android平台(正式导出)

学博而后可约,事历而后知要。 目录 一、准备二、Gradle构建三、配置Java SDK四、配置Android SDK五、配置密钥 一、准备 本文在前文【杂谈】Godot4.4导出到安卓平台(调试导出)的基础上,进行正式导出。调试导出并不是真正的编译导…

基于AI设计开发出来的业务系统是什么样的?没有菜单?没有表格?

基于AI设计开发出的业务系统仍然会包含菜单、表格等传统UI元素,但AI技术会显著改变它们的实现方式和交互逻辑。以下是具体分析: 一、传统元素的持续存在 功能刚需性 • 菜单承担着系统导航的核心功能,表格则是结构化数据展示的基础载体。根…

数字足迹管理(DFM):你的网络隐身指南

数字足迹管理(DFM):你的网络隐身指南 ‌你可能不知道,你的姓名、电话、住址正在网上被“明码标价”‌ ——而这一切,可能只是因为你点过外卖、寄过快递,甚至注册过一个网站。 一、什么是数字足迹管理&#…

如何避免“过度承诺”导致的验收失败

如何避免“过度承诺”导致的验收失败?关键在于: 评估可行性、设置合理目标、高频沟通反馈、阶段性验收、做好风险管理。其中设置合理目标至关重要,很多团队往往在项目初期为迎合客户或领导而报出“最理想方案”,忽略了资源、技术及…

紧跟数字人热潮:123 数字人分身克隆系统源码部署与风口洞察

在当今数字化浪潮中,数字人技术无疑已成为最具活力与潜力的领域之一,正以迅猛之势席卷多个行业,重塑着人们的交互方式与商业运作模式。C 站作为技术交流的前沿阵地,汇聚了众多关注前沿科技的开发者与技术爱好者,今天来…

QT控件 修改QtTreePropertyBrowser自定义属性编辑器源码,添加第一列标题勾选,按钮,右键菜单事件等功能

头阵子遇到一个需要修改QtTreePropertyBrowser控件的需求,QT开发做这么久了,这个控件倒是第一次用,费了点时间研究,在这里做个简单的总结。 QtTreePropertyBrowser控件 是 Qt 解决方案 (Qt Solutions) 中的一个组件,用…

开源模型应用落地-模型上下文协议(MCP)-从数据孤岛到万物互联(一)

一、前言 当开发者还在为每个AI工具编写臃肿的API适配器时,一场关于「连接」的技术革命已悄然降临。模型上下文协议(MCP)正在用一套全新的交互语法,重新定义人工智能与物理世界的对话方式。MCP协议如同为AI系统装上了“万能接口”…

【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)

文章目录 前言漏洞代码代码审计攻击步骤修复建议审计思路 前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据(一)中,介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识,本文通过分析具体合约代码进行…

mac 苍穹外卖 后端初始 SkyApplication 报错

报错内容 java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid deepseek 解决 打开 File > Project Structure > Project SDK, 选择 JDK17。我没有 JDK17就下载了一…

Proximal Policy Optimization (PPO)

2.1 策略梯度方法 策略梯度方法计算策略梯度的估计值并将其插入到随机梯度上升算法中。最常用的梯度估计器的形式如下: g ^ E t [ ∇ θ log ⁡ π θ ( a t ∣ s t ) A ^ t ] (1) \hat{g} \mathbb{E}_t \left[ \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) \h…

微信小程序:动态表格实现,表头单元格数据完全从data中获取,宽度自定义,自定义文本框,行勾选,样式效果,横向滚动表格(解决背景色不足的问题)等

一、样式效果 二、代码 1、wxml <view class"line flex flex-center"><view class"none" wx:if"{{info.length 0}}">暂无料号</view><view wx:else class"table-container"><!-- 动态生成表头 -->&…

python-Leetcode 65.搜索旋转排序数组

题目&#xff1a; 整数数组nums按升序排列&#xff0c;数组中的值互不相同 在传递给函数之前&#xff0c;nums在预先未知的某个小标K上进行了旋转&#xff0c;使数组变为[nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]&#xff0c;小标从0开始计数。…

Django学习记录-1

Django学习记录-1 虽然网上教程都很多&#xff0c;但是感觉自己记录一下才属于自己&#xff0c;之后想找也方面一点&#xff0c;文采不佳看的不爽可绕道。 参考贴 从零开始的Django框架入门到实战教程(内含实战实例) - 01 创建项目与app、加入静态文件、模板语法介绍&#xff…

K8s私有仓库拉取镜像报错解决:x509 certificate signed by unknown authority

前言 在Kubernetes环境中使用自签名证书的私有Harbor镜像仓库时&#xff0c;常会遇到证书验证失败的问题。本文将详细讲解如何解决这个常见的证书问题。 环境信息&#xff1a; Kubernetes版本&#xff1a;1.28.2容器运行时&#xff1a;containerd 1.6.20私有仓库&#xff1a…