Ubuntu 20.04源码编译安装OpenCV 4.7.0

news2024/11/15 8:39:27

目录

前言

1--下载OpenCV 4.7.0

2--编译安装OpenCV 4.7.0

3--测试

3-1--查看安装的版本

3-2--基于VSCode和CMake测试项目

4--报错解决(重点!)

4-1--OpenCV与FFmpeg不兼容

4-2--LIBTIFF报错

4-3--系统与Anaconda的库lib冲突

4-4--测试时CMake的find_package报错


前言

        建议先看第4节相关报错及解决方法,再进行安装!

1--下载OpenCV 4.7.0

        下载 OpenCV 4.7.0 的源码 Sources:OpenCV 4.7.0

2--编译安装OpenCV 4.7.0

① 解压压缩包:

unzip opencv-4.7.0.zip

② 安装依赖:

cd opencv-4.7.0

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev

③ 编译:

mkdir build 

cd build

cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TIFF=ON ..

注:-DBUILD_TIFF=ON 的作用在之后报错的章节中会说明;

④ 安装:

sudo make install -j8

# -j8表示CPU将使用多线程,加快安装速度

3--测试

3-1--查看安装的版本

pkg-config --modversion opencv4

        一般情况下,正常输入上面的命令就可以直接查看安装的版本,如果失败可以参考链接1进行配置环境;

3-2--基于VSCode和CMake测试项目

① 编写 main.cpp 文件:

# include<cstdio>
# include"opencv2/opencv.hpp"
 
using namespace cv;
 
int main(){
    printf("Hello, Opencv4!\n");
    Mat image = imread("./test1.jpg"); // 读取图片
 
    namedWindow("img1"); // 创建窗口
    imshow("img1", image); // 显示读取的图片
    waitKey(0);
    return 0;
}

② 使用 g++ 直接编译:

g++ main.cpp -o test `pkg-config --cflags --libs opencv4`

③ 使用 CMakeLists.txt 进行编译:

cmake_minimum_required(VERSION 3.10)  # 指定 cmake的 最小版本
project(test) # 设置项目名称
#set(OpenCV_DIR /usr/local/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
add_executable(main main.cpp) # 生成可执行文件
target_link_libraries(main ${OpenCV_LIBS} ) # 设置target需要链接的库
mkdir build

cd build

cmake ..

make

./main

4--报错解决(重点!)

4-1--OpenCV与FFmpeg不兼容

        博主在使用Ubuntu安装OpenCV前,曾基于源码编译安装过FFmpeg 5.1,两者存在冲突,会出现以下错误:

        ① modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_ffmpeg.cpp.o] Error 1;
        ② modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2

        ③ make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/build.make:302: lib/libopencv_videoio.so.4.7.0] Error 1;

        ④ relocation R_X86_64_PC32 against symbol `ff_pw_9' can not be used when making a shared object; recompile with -fPIC;

        出现上面几个错误,均与博主源码编译安装的FFmpeg 5.1有关。

解决方法:卸载FFmpeg 5.1,博主改用FFmpeg 4.3得以兼容;

4-2--LIBTIFF报错

        博主在编译安装OpenCV时,出现了以下 LIBTIFF 的错误:

        ① /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.7.0: undefined reference to `TIFFReadDirectory@LIBTIFF_4.0';

        ② make[2]: *** [modules/core/CMakeFiles/opencv_test_core.dir/build.make:812: bin/opencv_test_core] Error 1;

        ③ make[1]: *** [CMakeFiles/Makefile2:1985: modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2 make: *** [Makefile:163: all] Error 2;

解决方法:在编译安装的时候加上 -DBUILD_TIFF=ON 的选项,这里参考链接2

cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TIFF=ON ..

4-3--系统与Anaconda的库lib冲突

        博主在编译安装OpenCV的时候,出现了以下错误:

        ① /usr/bin/ld: /usr/lib/x86_64-linux-gnu/libfontconfig.so: undefined reference to `uuid_parse@UUID_1.0';

        ② make[2]: *** [modules/highgui/CMakeFiles/opencv_test_highgui.dir/build.make:122: bin/opencv_test_highgui] Error 1;

        ③ make[1]: *** [CMakeFiles/Makefile2:2938: modules/highgui/CMakeFiles/opencv_test_highgui.dir/all] Error 2 make: *** [Makefile:163: all] Error 2;

        报错的原因是Conda 的库与系统的库出现了冲突,具体分析可参考链接3;但博主并没有采用参考链接的解决方法,而是猜测只是由于博主在编译 OpenCV 的时候,并没有退出 Conda 环境;

解决方法:在终端退出Conda环境重新进行编译安装;

conda deactivate

4-4--测试时CMake的find_package报错

        博主在 VSCode 进行程序测试时,无法利用 CMakeLists.txt 进行间接编译,出现了以下错误:

        ① By not providing "FindOpencv.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Opencv", but CMake did not find one.

        ② Could not find a package configuration file provided by "Opencv" with any
  of the following names: OpencvConfig.cmake opencv-config.cmake;

         一开始,博主以为是没有设置 OpenCV_DIR 导致以上报错,所以参考其它答案使用了 Set 命令设置 OpenCV_DIR,但并不能解决;

        真正的原因其实是,一开始博主在 CMakeLists.txt 中的 find_package(Opencv REQUIRED)使用的小写的 cv,这才导致了错误。但博主在 Windows 和 Mac 系统下都使用了小写的 Opencv 并没有任何错误(离大谱,属实过分!!!),所以这里不确定真正的原因,部分博主分析了可能的原因,具体可参考链接4;

解决方法:将find_package的Opencv改为OpenCV;

衷心建议结合OpenCV Github项目的issue(问题专栏)进行编译安装!!!

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

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

相关文章

MATLAB-罗盘图绘制

compass 函数用于绘制罗盘图&#xff0c;利用直角坐标系&#xff0c;在圆形栅格上绘制图形&#xff0c;整个形状类似一个“罗盘”&#xff0c;具体使用格式如下。1 ) compass( x , y):函数绘制一个由原点出发、由(x ,y)组成的向量箭头图形。2 ) compass( z):等价于compass( rea…

6步速通:修复损坏的word文件

前两天&#xff0c;老师找到我&#xff0c;想让我帮忙修复一个打不开的docx文档。症状大概是这样&#xff1a; 打开文件的时候花了较长时间&#xff0c;并且显示了乱码&#xff0c;并且老师使用WPS自带的文档修复功能也无法修复。 遇到这个情况&#xff0c;到底怎么办呢&#…

【填坑向】我可能也就是踩了dockrfile部署jar包(需读取resource目录下的文件)全部的坑吧。。。

FileNotFoundException。。没错、这篇还是从读取的文件找不到的问题开始&#xff0c;今天来个终极版(&#xffe3;∇&#xffe3;)/一开始我把要读取的文件放在了项目根路径&#xff0c;package就没把它打进去&#xff0c;显然是找不到的&#xff0c;于是我把这个JSON文件移到了…

数据智能时代的营销新玩法RTA,你了解吗?|极客星球

近日&#xff0c;由国内知名产品经理社区PMTalk和MobTech联合举办的“从0到1深入产品运营方法论”沙龙活动圆满落幕&#xff0c;MobTech袤博科技开发者平台副总裁陆俊超在会上分享了RTA产品如何全方位提升用户增长效能。 RTA应运而生 在流量红利日益消退的环境下&#xff0c;…

中台KPI怎么设计?

在中台系统建设完毕之后&#xff0c;中台战略在一家企业中的落地工作就算完成了。 此时&#xff0c;我们必须有准确的指标来反映该战略的实际效果&#xff0c;因此就需要对中台战略在企业运作中的效益进行持续化的监测与评估。 行动点&#xff1a; &#xff08;1&#xff09…

app嵌入新功能,一键接入(内含低代码平台)

在app的开发运营中&#xff0c;有时会需要跟随着用户的使用习惯来进行业务上的更新迭代&#xff0c;比如说新增或删减部分功能&#xff0c;或是调整应用功能布局&#xff0c;优化组件分区&#xff0c;以达到更简洁的效果。那么对应的会有低代码平台提供一些通用组件&#xff0c…

机器学习--决策树、线性模型、随机梯度下降

目录 一、决策树 二、线性模型 三、随机梯度下降 一、决策树 决策树&#xff08;decision tree&#xff09;&#xff1a;是一种基本的分类与回归方法&#xff0c;此处主要讨论分类的决策树。 在分类问题中&#xff0c;表示基于特征对实例进行分类的过程&#xff0c;可以认为…

带你玩转指针——指针进阶(一)

指针的概念&#xff1a;指针就是变量&#xff0c;用来存放地址指针的大小是固定的4/8个字节&#xff08;32位平台/64位平台&#xff09;指针也是有类型的&#xff0c;指针类型决定了-步长&#xff0c;指针解引用时的权限字符指针在前面的学习我们知道了字符指针的初阶应用假如是…

xxljob 调度中心项目 调度一个方法到我们自己的项目,他是咋执行的

目录 1 需求2 实现1 需求 xxljob 调度中心项目 调度一个方法到我们自己的项目,他是咋执行的 2 实现 我们的项目首先是netty 服务器接收到,然后转发到run方法里面 核心就是下面的这个map对象 // 任务启动之后,时间一到就 创建一个 JobThread ,就放到这个priva…

【Linux kernel 文件系统入门及渐进 1 -- sysfs 介绍】

文章目录1.1 Sysfs 介绍1.1.1 kobject 产生背景1.1.2 主要的数据结构1.1.3 数据结构实现1.2 attribute 的功能概述1.2.1 struct attribute 实现1.2.2 attribute 文件的创建1.2.3 attibute 文件的 read 和 write1.1 Sysfs 介绍 Sysfs 是一个基于 RAM 的文件系统&#xff0c;它和…

如何优化.so mmap内存占用

1&#xff09;如何优化.so mmap内存占用 ​2&#xff09;模拟器下物理碰撞失效 3&#xff09;Unity RenderTexture的释放在安卓上并不能使GL内存完全回落 4&#xff09;数字人中&#xff0c;怎么做到胡子固定在嘴巴皮肤上 这是第319篇UWA技术知识分享的推送。今天我们继续为大家…

docker容器入门介绍

一、什么是docker容器 容器&#xff08;Container&#xff09;是基于镜像创建的运行实例&#xff0c;一个容器中可以运行一个或多个应用程序&#xff08;jdk开发的java应用 程序&#xff09;。 Docker 可以帮助你构建和部署容器&#xff0c;你只需要把自己的应用程序或者服务打…

对外投资数据集

一、2009-2018年各省省际对外非金融类直接投资流量情况数据来源&#xff1a; 中国商务年鉴2、时间跨度&#xff1a;2009-2018年3、区域范围&#xff1a;全国各省份二、2003&#xff0d;2018 OFDI对外直接投资存流量&#xff08;分国家&#xff09;与分省份对外直接投资存流量1、…

一个在关键路径上面隐藏了11个月的BUG:DragonOS进程切换查错

前言的前面 DragonOS是一个从0开始研发内核及用户态环境的&#xff0c;独立自主的&#xff0c;面向服务器领域的开源操作系统&#xff0c;提供Linux兼容性。 官网&#xff1a;https://DragonOS.org 代码仓库&#xff1a;GitHub - fslongjin/DragonOS: 一个64位的操作系统。A…

基于jsp+sevlet+mysql实现用户登陆和增删改查功能

基于jspsevletmysql实现用户登陆和增删改查功能一、系统介绍二、功能展示1.用户登陆2.用户列表3.查询用户信息4.添加用户信息5.修改用户信息6.删除用户信息三、其它系统四、获取源码一、系统介绍 系统主要功能&#xff1a; 用户登陆、添加用户、查询用户、修改用户、删除用户 …

用javascript分类刷leetcode4.贪心(图文视频讲解)

什么是贪心算法 贪心法&#xff0c;又称贪心算法&#xff0c;贪婪算法&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来最好的选择&#xff0c;期望通过每个阶段的局部最优选择达到全局最优&#xff0c;但结果不一定最优 适用场景&#xff1a;简单的说&#xff0c;…

手把手YOLOv5输出热力图

环境要求 我的版本是YOLOV5 7.0 先看结果&#xff1a; 结果仅供参考 具体步骤一&#xff1a; 首先配置好YOLO V5环境 这个采用pip install requirements即可 具体配置环境可以看我其他的博客有详细介绍 GPU环境自己配置 步骤二&#xff1a; 运行YOLO 没问题&#xff0c;输…

Excel表格的导入导出——EasyExcel

参考视频 csdn参考地址 一、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version> </dependency>二、实体类 方式一&#xff1a;Excel Property&#xff08;&…

Kubernetes Pod 底层实现原理

文章目录前言一、探索 Container1.1 设置实验环境&#xff08;playground&#xff09;1.2 探索容器的 namespace1.3 探索容器的 cgroupsCheck the memory limit.二、探索 Pod2.1 设置实验环境&#xff08;playground&#xff09;2.2 探索 Pod 的容器2.3 探索 Pod 的命名空间2.4…

UDP协议重点总结(附实例)

文章目录前言一、网络的原生情况二、UDP协议2.1 UDP的特点2.1.1 不可靠性2.1.2 无连接&#xff08;不是缺点&#xff09;2.1.3 面向数据报&#xff08;优点&#xff09;2.1.4 缓冲区2.1.5 大小受限2.2 UDP协议端格式2.3 关于校验和2.4 基于UDP的应用层协议三、UDP总结&#xff…