Ubuntu22.04环境下源码安装OpenCV 4.8.1

ops/2024/10/15 22:30:29/

因为项目需要用OpenCV对yolov8模型进行推理,通过DNN模块,之前本地的OpenCV版本是4.5.4(好像安装完ROS2 humble之后系统就自带了opencv),加载onnx模型一直报错,网上查询到需要4.7以上,干脆直接升级到4.8.1了。

目录

  • 1.源码下载
  • 2.环境准备
  • 3.源码编译
  • 4.环境配置
  • 5.测试验证
  • 6.CMake中指定OpenCV版本

1.源码下载

opencv:https://github.com/opencv/opencv

  • 选择4.8.1的源码包进行下载
    在这里插入图片描述

opencv_contrib:https://github.com/opencv/opencv_contrib

  • 同样选择4.8.1的源码包进行下载
    在这里插入图片描述
  • 下载好后选择通过图形界面或者unzip命令进行解压。并将contrib源码文件夹移动到opencv文件夹中
    在这里插入图片描述

2.环境准备

  • 安装依赖和cmake工具
    打开终端,输入如下代码进行安装依赖和cmake工具安装:
sudo apt-get install build-essentialsudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libgtk-3-devsudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-devsudo apt-get -y install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

在这里插入图片描述

3.源码编译

  • 在之前解压的opencv-4.8.1文件夹下建立一个build文件夹,并进入该文件夹
mkdir build && cd build

PS:如果你不想安装opencv的其他一些语言的接口,可以自行参考下面的命令

指定编译类型,并将编译后的库安装到/usr/local/

sudo cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.8.1/modules -D BUILD_JAVA=OFF -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=OFF CMAKE_INSTALL_PREFIX=/usr/local ..

耐心等待,会下载一些其他库、、、
在这里插入图片描述
在这里插入图片描述

  • 编译
sudo make -j4

在这里插入图片描述
在这里插入图片描述

  • 安装到/usr/local
sudo make install

在这里插入图片描述

4.环境配置

  • 配置导入路径
sudo gedit /etc/ld.so.conf

在打开的文件后面添加/usr/local/lib,然后用下面的命令加载更新后的配置。
在这里插入图片描述

sudo ldconfig 
  • 输入以下命令检查安装版本
pkg-config opencv --modversion

如果出现如下错误:
在这里插入图片描述

解决:

 cd /usr/local/libsudo mkdir pkgconfig # 如果已经存在则不需要再创建cd pkgconfigsudo gedit opencv.pc

在打开的文本写入如下信息,保存,然后退出

prefix=/usr/localexec_prefix=${prefix}includedir=${prefix}/includelibdir=${exec_prefix}/libName: opencvDescription: The opencv libraryVersion:4.8.1Cflags: -I${includedir}/openCV4Libs: -L${libdir} -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann  -lopencv_core~
  • 修改rc文件
gedit ~/.bashrc

在文件末尾添加两行:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

关闭保存后,使用以下命令更新以下配置

source /.bashrc

输入以下命令检查安装版本

pkg-config opencv --modversion

在这里插入图片描述

5.测试验证

打开终端,进入原先opencv源码目录下,并输入以下命令对例程进行编译

cmake .
make
./opencv_example

得到以下画面

在这里插入图片描述
在这里插入图片描述

6.CMake中指定OpenCV版本

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(OpenCVProject)# 指定OpenCV版本的路径
set(OpenCV_DIR /usr/local/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
message(STATUS "***OpenCV version: ${OpenCV_VERSION}")add_executable(MyOpenCVApp src/main.cpp)target_link_libraries(MyOpenCVApp ${OpenCV_LIBS})
  • main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>int main()
{std::cout << "OpenCV version: " << CV_VERSION << std::endl;return 0;
}

参考:https://www.bilibili.com/read/cv30840280/


http://www.ppmy.cn/ops/126145.html

相关文章

公共字段自动填充

因为在后端开发中需要用到很多sql语句&#xff0c;公共字段填充可以很好的减轻代码量 枚举类型&#xff08;为什么使用枚举类型&#xff0c;因为枚举可以可以用来进行标识&#xff09;&#xff1a; /*** 数据库操作类型*/ public enum OperationType {/*** 更新操作*/UPDATE,…

Go语言Gin框架的常规配置和查询数据返回json示例

文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案&#xff0c;这一篇文章…

git pull

# git reset --hard # git clean -f #git pull git pull origin master

MySQL事务、存储引擎

目录 一、事务 1.1 事务的概念 1.2 事务的ACID特点 1.2.1 原子性 1.2.2 一致性 1.2.3 隔离性 1.2.4 持久性 1.3 事务控制语句 1.4 使用 set 设置控制事务 二、存储引擎 2.1 存储引擎的定义 2.2 常用的存储引擎 2.3 存储引擎的管理操作 三、死锁 3.1 定义 3.2 死…

【git】本地玩坏了不必重新clone

#没错&#xff0c;事情发生的起因就是我把本地玩坏了……然后傻乎乎地打算rm掉重新再clone&#xff0c;巨慢真的&#xff0c;然后我就又被涨知识了&#xff0c;分享一下&#xff0c;如果已经知道的就笑笑路过吧哈哈哈# 场景 需要重新clone的&#xff0c;恢复到与远端仓库一致…

站在用户视角审视:以太彩光与PON之争

作者:科技作家-郑凯 园区,是企业数字化转型的“中心战场”。 云计算、大数据、人工智能等数智化技术在园区里“战火交织”;高清视频、协同办公,智慧安防等大量创新应用产生的海量数据在园区内“纵横驰骋”;加上大量的IOT和智能化设备涌入“战场”,让园区网络面对着难以抵御的…

【Java 问题】集合——List

List 1.说说有哪些常见集合&#xff1f;2.ArrayList和LinkedList有什么区别&#xff1f;3.ArrayList的扩容机制了解吗&#xff1f;4.ArrayList怎么序列化的知道吗&#xff1f; 为什么用transient修饰数组&#xff1f;5.快速失败(fail-fast)和安全失败(fail-safe)了解吗&#xf…

代码随想录算法训练营第三十五天|452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

452. 用最少数量的箭引爆气球 在二维空间中有许多球形的气球。对于每个气球&#xff0c;提供的输入是水平方向上&#xff0c;气球直径的开始和结束坐标。由于它是水平的&#xff0c;所以纵坐标并不重要&#xff0c;因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结…