当前位置: 首页 > news >正文

Ubuntu20.04 由源码编译安装opencv3.2 OpenCV

Ubuntu20.04 由源码编译安装opencv3.2.0

获取 opencv 及opencv_contrib源代码

创建目录以存放opencv及opencv_contrib源代码

mkdir ~/opencv3.2.0
cd ~/opencv3.2.0

获取opencv源代码并切换到对应tag

git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 3.2.0
cd ..

获取opencv_contrib源代码并切换到对应tag

git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout 3.2.0
cd ..

编译安装

创建构建目录

cd ~/opencv3.2.0/opencv
mkdir build && cd build

配置 CMake

cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.2.0 \-D OPENCV_EXTRA_MODULES_PATH=~/opencv_builds/opencv_contrib-3.2.0/modules \-D ENABLE_PRECOMPILED_HEADERS=OFF .. #不添加这一句编译时会出现/usr/include/c++/9/cstdlib:75:15: fatal error: stdlib.h: 没有那个文件或目录的报错信息

参数说明:

  1. CMAKE_BUILD_TYPE=Release
    • 这个参数指定构建类型。Release 意味着编译器将优化生成的代码,去除调试信息,使得最终的程序运行得更快。这是生产环境中推荐的设置,相对于 DebugRelease 编译的程序执行效率更高,但不利于调试。
  2. CMAKE_INSTALL_PREFIX=/usr/local/opencv3.2.0
    • 这个参数指定安装路径。/usr/local/opencv3.2.0 表示 OpenCV 将被安装在这个目录下。通常默认安装在 /usr/local,但指定一个包含版本号的子目录可以帮助管理不同版本的 OpenCV。
  3. OPENCV_EXTRA_MODULES_PATH=~/opencv_builds/opencv_contrib-3.2.0/modules
    • 此参数指定额外模块的路径,这里是 OpenCV 的贡献模块(contrib modules)。这些模块不包含在主 OpenCV 仓库中,提供了额外的功能和实验性算法。通过提供这个路径,你可以在构建 OpenCV 时包含这些额外的模块。
  4. ENABLE_PRECOMPILED_HEADERS=OFF
    • 这个选项用于控制是否使用预编译头文件。预编译头文件可以加快编译过程,但在某些情况下可能会引起问题,比如在不同的构建环境间迁移代码时。设置为 OFF 可以提高代码的可移植性,尤其是在有多个不同编译环境或者不同的编译器版本时。
    • 这表示 cmake 将在当前目录的上一级目录中查找 CMakeLists.txt 文件。这是启动构建过程的配置脚本,包含了所有必要的构建信息。

编译并安装

make -j$(nproc)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/499790c069454d5f9c0ede0328db5688.png#pic_center)sudo make install
  • 安装成功,如下:安装路径为 CMake配置时设置的目录

编译报错解决

/usr/include/c++/9/cstdlib:75:15: fatal error: stdlib.h: 没有那个文件或目录

在这里插入图片描述

报错原因

这个编译错误通常表明在你的系统中找不到标准库文件 stdlib.h。这种情况可能是因为系统缺少某些必要的开发包或者环境变量配置不当,导致编译器无法定位到这些标准头文件。此外,由于你使用的是较新的 Ubuntu 版本(20.04)和可能较新的编译器,而 OpenCV 3.2.0 是一个较旧的版本,它可能不完全兼容最新的编译器或其默认配置,这也可能是导致找不到头文件的原因之一。

解决方法
  • 禁用预编译头文件

  • 在配置CMake的时候添加如下指令:-D ENABLE_PRECOMPILED_HEADERS=OFF

  • 例如:

cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.2.0 \-D OPENCV_EXTRA_MODULES_PATH=~/opencv_builds/opencv_contrib-3.2.0/modules \-D ENABLE_PRECOMPILED_HEADERS=OFF .. #不添加这一句编译时会出现/usr/include/c++/9/cstdlib:75:15: fatal error: stdlib.h: 没有那个文件或目录的报错信息

OpenCV 代码中使用的 FFmpeg 库宏定义与最新版 FFmpeg 库中的定义不一致

在这里插入图片描述

报错原因

在安装并编译 OpenCV 3.2.0 版本时,出现的编译错误主要是由于 OpenCV 代码中使用的 FFmpeg 库宏定义与最新版 FFmpeg 库中的定义不一致所致。具体来说,原有的宏 CODEC_FLAG_GLOBAL_HEADERAVFMT_RAWPICTURE 在较新的 FFmpeg 版本中已被重命名或废弃,从而导致编译失败。这些错误表明存在 API 不兼容的问题,即 OpenCV 的旧代码与新版本 FFmpeg 的接口不匹配。

  1. CODEC_FLAG_GLOBAL_HEADER 未声明:
    • 在旧版本的 FFmpeg 中,CODEC_FLAG_GLOBAL_HEADER 用于设置编码器标志,指示编码器在输出文件中生成全局头部信息,而不是每个输出帧中都包含头部信息。
    • 新版本的 FFmpeg 将此宏重命名为 AV_CODEC_FLAG_GLOBAL_HEADER。由于 OpenCV 源码没有跟进这一变更,因此在编译时未找到原有宏名,导致编译错误。
  2. AVFMT_RAWPICTURE 未声明:
    • AVFMT_RAWPICTURE 在旧版 FFmpeg 中用于标识输出格式(封装格式),允许直接将未压缩的视频帧写入媒体文件,这在新版本中已被废弃或功能已改变。
    • 由于 FFmpeg 更新后移除了此宏,当 OpenCV 代码尝试使用它时,同样导致了编译错误。
解决方法
  1. 打开源代码文件

    • 找到并打开 cap_ffmpeg_impl.hpp 文件。
    • 路径如下:
    • /home/lyb/opencv3.2.0/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp
  2. 添加宏定义

    • 在文件最开始的部分(通常在包含头文件之后)添加以下宏定义:

      #define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
      #define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
      #define AVFMT_RAWPICTURE 0x0020
      
    • 这些定义将重新引入旧宏,以确保代码兼容当前的 FFmpeg 版本。

C++ 和 Python 接口间的类型不匹配

在这里插入图片描述

报错原因

当在 Ubuntu 20.04 上从源代码编译安装 OpenCV 3.2 时,遇到的编译错误表明 cv2.cpp 文件在编译过程中出现问题。特别是,错误提示集中在 cv2.cpp.o 的生成上,这是 Python 接口文件的编译输出对象。此错误可能是由于 C++ 和 Python 接口间的类型不匹配或者 API 已经更新而代码未跟进引起的。

  • make[2]: *** [modules/python3/CMakeFiles/opencv_python3.dir/build.make:329: modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o] Error 1
    • 这一行表示在执行编译命令时,处理 cv2.cpp 文件时遇到错误,导致无法成功生成对象文件 .o
  • make[1]: *** [CMakeFiles/Makefile2:11856: modules/python3/CMakeFiles/opencv_python3.dir/all] Error 2
    • 此行表明编译整个 Python 模块时遇到问题,且因为依赖的部分编译失败,整个模块编译无法继续。
  • make: *** [Makefile:163: all] Error 2
    • 最顶层的 Makefile 在尝试完成所有编译任务时遇到了阻碍,整个构建进程因此终止。
解决方法
  • 在cv2.cpp中找到对应代码行(/home/lyb/opencv3.2.0/opencv/modules/python/src2),如下:
char* str = PyString_AsString(obj);
  • 将其修改为:
char* str = (char *)PyString_AsString(obj);

系统环境变量配置

编辑.bashrc文件

sudo vim .bashrc

环境变量设置

export PATH=/usr/local/opencv3.2.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig #opencv4默认不启用pkgconfig,需要在CMake配置时开启
参数含义解释:
  1. export PATH=/usr/local/opencv3.2.0/bin:$PATH:

    • PATH 是一个环境变量,用于定义操作系统搜索可执行文件的目录列表。当你在命令行中输入一个命令时,系统会按照 PATH 环境变量定义的顺序来搜索这些目录,以找到可执行文件。
    • 此命令将 OpenCV 的 bin 目录 /usr/local/opencv3.2.0/bin 添加到现有的 PATH 变量之前。这意味着系统会首先在此目录中查找可执行文件,这对于使用 OpenCV 提供的各种工具和示例程序非常重要。
    • 通过将 OpenCV 的 bin 目录添加到 PATH,你可以从任何位置启动终端并直接运行 OpenCV 的可执行文件,而无需输入完整的路径。
  2. export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH:

    • LD_LIBRARY_PATH 是一个环境变量,用于定义动态链接器搜索共享库时的目录列表。
    • 此命令将 OpenCV 的 lib 目录 /usr/local/opencv3.2.0/lib 添加到现有的 LD_LIBRARY_PATH 环境变量之前。这确保了在运行依赖 OpenCV 库的程序时,系统能够在这个目录中优先查找所需的动态库(.so 文件)。
    • 设置 LD_LIBRARY_PATH 对于确保程序能找到正确版本的动态库非常重要,尤其是在系统中存在多个版本的库时。
  3. export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig:

    • PKG_CONFIG_PATH 是一个环境变量,用于指定 pkg-config 工具搜索其 .pc 文件的路径。.pc 文件包含了使用库(如编译器和链接器标志)所需的元数据。
    • 通过设置 PKG_CONFIG_PATH 环境变量为 /usr/local/opencv3.2.0/lib/pkgconfig,你告诉 pkg-config 工具在编译依赖 OpenCV 的应用程序时,首先在此目录中查找 OpenCV 的配置文件。
    • 这对于开发和编译依赖 OpenCV 的第三方应用程序非常重要,因为它简化了编译和链接过程,确保了使用正确的编译器标志和链接选项。

刷新环境变量

source ~/.bashrc

验证是否设置成功

pkg-config --modversion opencv
  • 应输出3.2.0

在这里插入图片描述

  • 自此 ubuntu20.04 opencv3.2安装成功

相关文章:

Ubuntu20.04 由源码编译安装opencv3.2 OpenCV

Ubuntu20.04 由源码编译安装opencv3.2.0 获取 opencv 及opencv_contrib源代码 创建目录以存放opencv及opencv_contrib源代码 mkdir ~/opencv3.2.0 cd ~/opencv3.2.0获取opencv源代码并切换到对应tag git clone https://github.com/opencv/opencv.git cd opencv git checkou…...

A058-基于Spring Boot的餐饮管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…...

RDIFramework.NET CS敏捷开发框架 SOA服务三种访问(直连、WCF、WebAPI)方式

1、介绍 在软件开发领域&#xff0c;尤其是企业级应用开发中&#xff0c;灵活性、开放性、可扩展性往往是项目成功的关键因素。对于C/S项目&#xff0c;如何高效地与后端数据库进行交互&#xff0c;以及如何提供多样化的服务访问方式&#xff0c;是开发者需要深入考虑的问题。…...

Linux——命名管道及日志

linux——进程间通信及管道的应用场景-CSDN博客 文章目录 目录 文章目录 前言 一、命名管道是什么&#xff1f; 理解&#xff1a; 2、编写代码 makefile 管道封装成类&#xff0c;想用中管道时只需要调用实例化 读端 写端 日志 1、日志是什么&#xff1f; 2、日志有什么&#x…...

Flink 常见面试题

1、Flink 的四大特征&#xff08;基石&#xff09; checkpoin基于Chandy-Lamport算法实现了分布式一致性快照提供了一致性的语义 state丰富的StateAPI time实现了Watermark机制&#xff0c;乱序数据处理&#xff0c;迟到数据容忍 window开箱即用的滚动&#xff0c;滑动会话窗口…...

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable

解决方法&#xff1a; 1、先测量pcf8563电源电压&#xff0c;是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间&#xff0c;未初始化&#xff0c;非法&#xff0c;芯片门槛电压检测配置不合理。使用hwclock命令写入一次&#xff0c;即可解决。 hwclock -f /dev/…...

(简单5步实现)部署本地AI大语言模型聊天系统:Chatbox AI + grok2.0大模型

摘要&#xff1a; 本文将指导您如何部署一个本地AI大语言模型聊天系统&#xff0c;使用Chatbox AI客户端应用和grok-beta大模型&#xff0c;以实现高效、智能的聊天体验。 引言&#xff1a; 由马斯克X-AI发布的Grok 2大模型以其卓越的性能超越了GPT4.0。Grok模型支持超长文本…...

MAUI APP开发蓝牙协议的经验分享:与跳绳设备对接

在开发MAUI应用程序时&#xff0c;蓝牙协议的应用是一个重要的环节&#xff0c;尤其是在需要与外部设备如智能跳绳进行数据交换的场景中。以下是我在开发过程中的一些经验和心得&#xff0c;希望能为你的项目提供帮助。 1. 蓝牙协议基础 蓝牙协议是无线通信的一种标准&#x…...

最新版Node.js下载安装及环境配置教程

目录 初识&#xff1a;Node.js 一、下载&#xff1a;Node.js 二、安装&#xff1a;Node.js 1.下载【node.js】压缩包安装文件 2.解压下载的安装包 3.打开解压的【node-v22.11.0-x64】文件夹 4.双击启动安装程序 5.点击【Next】 6.勾选【I accept the terms in the Lic…...

51c自动驾驶~合集39

我自己的原文哦~ https://blog.51cto.com/whaosoft/12707676 #DiffusionDrive 大幅超越所有SOTA&#xff01;地平线DiffusionDrive&#xff1a;生成式方案或将重塑端到端格局&#xff1f; 近年来&#xff0c;由于感知模型的性能持续进步&#xff0c;端到端自动驾驶受到了来…...

单链表基础操作

文章目录 abstract定义结点结构初始化链表遍历链表求表长查找结点根据序号查找结点根据值查找结点 插入结点首尾位置插入一般位置插入(通用插入)找到尾元素|尾指针相关操作 删除结点 abstract 单链表是一种简单的动态数据结构&#xff0c;它由一系列结点组成&#xff0c;每个结…...

Asp.net MVC在VSCore中的页面的增删改查(以Blog项目为例),用命令代码

在VSCore中的页面的增删改查(以Blog项目为例) 1.创建项目&#xff08;无解决方案&#xff09;复杂项目才需要 dotnet new mvc -o Blog2.控制器 BlogsController.cs 控制器&#xff08;Controller&#xff09;名字和视图&#xff08;View&#xff09;中的文件名要一模一样 u…...

【Leecode】Leecode刷题之路第66天之加一

题目出处 66-加一-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 66-加一-官方解法 方法1&#xff1a;找出最长的后缀9 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&#…...

使用 VLC 在本地搭建流媒体服务器 (详细版)

提示&#xff1a;详细流程 避坑指南 Hi~&#xff01;欢迎来到碧波空间&#xff0c;平时喜欢用博客记录学习的点滴&#xff0c;欢迎大家前来指正&#xff0c;欢迎欢迎~~ ✨✨ 主页&#xff1a;碧波 &#x1f4da; &#x1f4da; 专栏&#xff1a;音视频 目录 借助VLC media pl…...

Ubuntu 常用解压与压缩命令

.zip文件 unzip FileName.zip # 解压 zip DirName.zip DirName # 将DirName本身压缩 zip -r DirName.zip DirName # 压缩&#xff0c;递归处理&#xff0c;将指定目录下的所有文件和子目录一起压缩 zip DirName.zip DirName 行为&#xff1a; 只压缩 DirName 目录本身&#xff…...

【深度学习】四大图像分类网络之AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever&#xff08;均为Hinton的学生&#xff09;和Geoffrey Hinton&#xff08;被誉为”人工智能教父“&#xff0c;首先将反向传播用于多层神经网络&#xff09;在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…...

Day1——GitHub项目共同开发

MarkDowm解释 Markdown是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成结构化的HTML代码。Markdown的目的是让文档的编写和阅读变得更加容易&#xff0c;同时也不失HTML的强大功能。以下是Markdown的一些基本概念和用法&a…...

基于PHP的香水销售系统的设计与实现

摘 要 时代科技高速发展的背后&#xff0c;也带动了经济的增加&#xff0c;人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中&#xff0c;给对方留下良好地第一印象的产品&#xff0c;在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大&#xff…...

A-star算法

算法简介 A*&#xff08;A-star&#xff09;算法是一种用于图形搜索和路径规划的启发式搜索算法&#xff0c;它结合了最佳优先搜索&#xff08;Best-First Search&#xff09;和Dijkstra算法的思想&#xff0c;能够有效地寻找从起点到目标点的最短路径。A*算法广泛应用于导航、…...

前端用原生js下载File对象文件,多用于上传附件时,提交之前进行点击预览,或打开本地已经选择待上传的附件列表

用于如上图场景&#xff0c;已经点击选择了将要上传的文件&#xff0c;在附件列表里面用户希望点击下载文件&#xff0c;以核实自己是否选中了需要上传的文件&#xff0c;此刻就需要 用到下面的方法&#xff1a; // 下载File对象文件 downloadByFileObject(file, { fileName }…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...