linux下编译OpenCV

很多朋友在 Linux 系统中为 C++ 程序安装 OpenCV (从源代码生成)时经常会遇到各种各样的问题,尤其是对 C++ 生成系统或 Linux 不熟的情况下就更难以完成了。我也是被问得太烦了,干脆写一篇文章来行详解。其实也不怎么复杂,主要是大家对这种事情没什么耐心罢了,严格按下文介绍的步骤操作,基本没有不成功的。

 

一、生成的目标

如果你只在 Python 中调用 OpenCV ,完全可以使用 pip 命令安装任意版本:

 

python3 -m pip install opencv-python==<VERSION>

本文以下内容所介绍的是从源代码生成并安装 OpenCV 的方法,这样安装的 OpenCV 具有以下特点:

 

提供 C/C++ 程序调用接口,并可选择是否支持 Python,

可以任意删除不需要的组件,避免安装过多的系统依赖,减小空间占用,

可以自行修改 OpenCV 源代码,实现定制化目的,

可自由配置生成选项,实现更换底层库、生成共享/静态库、构建纯单线程版本等定制化需求,

可以指定安装路径,以方便同时兼容不同版本。

生成和安装完成后,你会得到指定安装路径下的 OpenCV 众多头文件和各模块的共享库 (.so) 或静态库 (.a) 。如果指定了生成和安装 Python 接口,还会得到 Python 包相关文件。

 

二、软硬件系统

系统方面

 

在 Linux 系统中安装 OpenCV ,当然前提是有 Linux 操作系统,各类较常见的 Linux 发行版都可以顺利安装,甚至包括各类 arm 系统。

 

硬件方面

 

如果需要 CUDA 模块,必须拥有 NVidia 显卡,并正确安装了显卡驱动和 CUDA 。

 

内存方面不能低于 2GiB 空闲内存。请注意是空闲内存,如果全部内存大小只有 2GiB 很可能是无法完成编译的。

 

CPU 没有限制,但如果需要在 1 小时内生成完成 OpenCV 的所有组件(含 CUDA),大概需要 4 核以上的 CPU 。其中 CUDA 模块的生成时间非常缓慢,如果你只有单核或双核 CPU 进行生成,总时长可能在 2 个小时以上。

 

三、OpenCV 的组件

OpenCV 包括主体和 opencv-contrib 库两部分,这兄弟俩的 github 地址分别是:

 

GitHub - opencv/opencv: Open Source Computer Vision Library

 

GitHub - opencv/opencv_contrib: Repository for OpenCV's extra modules

 

以 OpenCV 4.5.3 为例,其主体提供的模块:

 

core, imgcodecs, imgproc, calib3d, highgui, dnn, features2d, flann, gapi, ml, objc, objdetect, photo, stitching, ts, video, videoio

opencv-contrib 则是一些外围组件,提供的模块包括:

 

cuda, alphamat, aruco, bgsegm, bioinspired, ccalib, cnn_3dobj, cvv, datasets, dnn_objdetect, dnn_superres, dnns_easily_fooled, dpm, face, freetype, fuzzy, hdf, julia, line_descriptor, matlab, mcc, optflow, ovis, plot, reg, rgbd, saliency, sfm, stereo, structured_light, surface_matching, text, tracking, xfeatures2d, ximgproc, xobjdetect, xphoto

这些库各自的功能在官方的说明文档中有非常详细的介绍,此处就不展开说明了。

 

如果你不需要使用 opencv-contrib 库中的模块,可以只生成 OpenCV ,而无需下载和生成 opencv-contrib 。但务必注意,如果要将 opencv-contrib 库加入 OpenCV 的生成,这哥俩的版本号必须严格一致。

 

四、依赖项

生成 OpenCV 的主要依赖项在下表中列出:

 

名称 apt package 名称 功能

编译系统 build-essential cmake pkg-config 生成 OpenCV

图像库 libpng-dev libjpeg-dev 提供各类图像格式的编解码

OpenBLAS libopenblas-dev 利用 CPU 向量运算指令为大量算法提供加速。

Eigen3 libeigen3-dev 提供线性代数相关算法支持

Intel TBB libtbb-dev 在 Intel CPU 上提供高性能并发计算支持

FFMPEG libavcodec-dev libavformat-dev libswscale-dev 提供视频编解码能力

GStreamer libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev 提供流媒体处理能力

GTK libgtk-3-dev libcanberra-gtk-module libcanberra-gtk3-module 图形化用户界面

上面这些依赖项中除了第一项之外都不是必须的,但如果没有安装这些项,生成出来的 OpenCV 就会缺少相应的功能。将上述依赖项汇总为一条 apt 命令如下:

 

sudo apt-get install -y libcurl4 build-essential pkg-config cmake \

    libopenblas-dev libeigen3-dev libtbb-dev \

    libavcodec-dev libavformat-dev \

    libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev \

    libswscale-dev libgtk-3-dev libpng-dev libjpeg-dev \

    libcanberra-gtk-module libcanberra-gtk3-module

你可根据需要来自行增减这些组件,比如在服务器端安装不需要 GUI 支持,那就不需要安装 GTK 相关的包,这样生成出来的 OpenCV 自然也就不提供 imshow ,waitKey 等 GUI 相关函数。

 

五、生成

先下载源码包,可从OpenCV 和 opencv-contrib 各自的 Release 页下载指定版本:

 

Releases · opencv/opencv

 

Releases · opencv/opencv_contrib

 

将源代码包解压后,使 opencv 目录和 opencv-contrib 目录位于相同的父目录内,并确认这两个目录下都存在 modules 子目录:

 

ls opencv/opencv-4.3.1/modules

ls opencv/opencv_contrib-4.3.1/modules

这些相对路径关系不可搞错。

 

OpenCV 使用 CMake 工具进行生成(4.x 以上版本已支持 Ninjia),编译选项繁多而复杂,参见:OpenCV configuration options reference

 

先在 opencv/opencv-4.3.1 目录下建立 build 子目录并进入 build 子目录:

 

cd opencv/opencv-4.3.1

mkdir -p build && cd build

然后执行 cmake 命令,格式为:

 

cmake .. -D<选项名1>=<设定值1> -D<选项名2>=<设定值2>

这个命令中的「..」表示 CMakeLists.txt 文件所在的路径位于 build 的上级目录。CMake 执行生成时会生成许多辅助文件(主要是 Makefile),为了不让这些文件搞乱工程的根目录,所以通常都会在工程目录下建立一个 「build」子目录,在该子目录中执行 cmake 命令,所有的辅助文件就会存放在这里。

 

命令的后面(全部放在「..」前也可以)是所有生成选项的设定。这里对最常用的一些选项进行整理和说明:

 

CMAKE_BUILD_TYPE=Release:不在行成的库文件中包含调试信息,并进行速度优化。如果指定为 Debug ,就可以在 Debug 过程中进入 OpenCV 内部的代码,但运行速度会略微下降。

CMAKE_VERBOSE_MAKEFILE=ON:务必开启,以便于发现编译中出现的问题。

CMAKE_INSTALL_PREFIX=/usr/local:指定 OpenCV 生成的库文件在系统中的安装路径。

BUILD_SHARED_LIBS=ON:成共享库(.so),如果置为 OFF 则只会生成静态库(.a)

OPENCV_EXTRA_MODULES_PATH=<opencv-contrib 目录>,按之前的描述,应为 「../../opencv_contrib-4.3.1」。可以用 ls 命令确认相对路径是否存在。

OPENCV_ENABLE_NONFREE=ON:如果置为OFF,一些包含专利保护算法的函数将不会生成。

ENABLE_CXX11=ON:支持 C++11 以上的语法和 STL 库。

BUILD_TESTS=OFF,BUILD_PERF_TESTS=OFF:关闭生成后的自我 TEST ,大多数情况没有必要,可大辐缩短生成时间。但如果怀疑生成的 OpenCV 库有问题,可以进行自测。

OPENCV_GENERATE_PKGCONFIG=ON:建议开启,便于 C++ 程序通过 pkg-config 来引用 OpenCV 库。

WITH_CUDA=ON,ENABLE_FAST_MATH=ON,CUDA_FAST_MATH=ON,WITH_CUBLAS=ON:如果系统正确安装了 CUDA 并希望 OpenCV 启用 CUDA 支持,这四个选项都要打开。

WITH_IPP=ON,WITH_TBB=ON,WITH_OPENMP=ON,WITH_PTHREADS_PF=ON:这四个选项控制 OpenCV 如何进行并发运算,默认都是 ON,但如果有需要生成一个绝对单线程运行的 OpenCV ,请将这几个选项均置为 OFF 。

下面是最麻烦的一组选项:支持 Python 调用的接口。如果不需要 Python 接口的可以跳过这一段。

 

首先,Python2 已停止维护,这里也不介绍支持 Python2 调用的方法了。如需 OpenCV 提供 Python3 支持,要先设定:

 

BUILD_opencv_python3=ON

然后以下的三个选项必须设置正确,否则 OpenCV 的 Python3 接口不能正常生成或被正确调用:

 

PYTHON3_LIBRARY:Python3 C++接口库的路径

PYTHON3_NUMPY_INCLUDE_DIRS:Python3 C++头文件的路径,

PYTHON3_PACKAGES_PATH:OpenCV 的 Python3 包安装的路径。

这三个路径可能许多同学并不清楚,但不用担心,有以下命令可以自动找出这些路径:

 

python3 -c "from distutils.sysconfig import get_config_var;from os.path import dirname,join ; print(join(dirname(get_config_var('LIBPC')),get_config_var('LDLIBRARY')))"

python3 -c "import numpy; print(

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

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

相关文章

生命周期标注

fn main() {let r;{let x 5;r &x}print!("r:{}", r); }let r 这种初始化的方式在RUST中是被允许的&#xff0c;过程中程序声明了两个变量x和r&#xff0c;程序无法正常编译。 x does not live long enough 编译报错的原因&#xff1a;被引用对象的存活时间短语…

用HeidiSQL在MySQL中创建新的数据库

用有权限的用户登录&#xff1a; 右键单击&#xff0c;选择&#xff1a; 输入要创建的数据库名称&#xff0c;然后点击“确定”&#xff1a; 刷新下&#xff0c;就看到新创建的数据库了&#xff1a; 在新创建的数据库中&#xff0c;就可以做其它操作了&#xff0c;例如…

docker 切换镜像源

Dockerfile build 报错了&#xff1a; WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.18/main: temporary error (try again later) WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.18/community: 这个问题是默认的 Alpine Linux 的软件包镜像源…

uniapp微信小程序实现地图展示控件

最终实现效果&#xff1a; 地图上展示控件&#xff0c;并可以点击。 目录 一、前言 二、在地图上展示控件信息 点击后可进行绘制面图形 1.使用cover-view将控件在地图上展示 2.设置控件样式&#xff0c;使用好看的图标 3.控件绑定点击事件 一、前言 原本使用的是control…

Android 11.0 所有音量默认为最大音量值

Android 11.0 所有音量默认为最大音量值 最近接到邮件需求想要将设备的所有音量的音量值默认为最大&#xff0c;修改默认音量值是在AudioSystem.java中的修改&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/media/java/android/media/AudioSystem.java /// M: m…

nginx 配置前端项目添加https

可申请阿里云免费证书 步骤省略… nginx 配置 server {listen 8050; #默认80端口 如果需要所有访问地址都是https 需要注释listen 8443 ssl; #https 访问的端口 &#xff0c;默认443server_name 192.168.128.XX; #域名 或 ip# 增加ssl#填写证书文件…

Java多线程-第20章

Java多线程-第20章 1.创建线程 Java是一种支持多线程编程的编程语言。多线程是指在同一程序中同时执行多个独立任务的能力。在Java中&#xff0c;线程是一种轻量级的子进程&#xff0c;它是程序中的最小执行单元。Java的多线程编程可以通过两种方式实现&#xff1a;继承Threa…

IntelliJ IDEA安装使用教程

IntelliJ IDEA是一个流行的Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它是一款全功能的IDE&#xff0c;支持多种编程语言&#xff0c;如Java、Kotlin、Groovy、Scala、Python、JavaScript、HTML、CSS等等。IntelliJ IDEA 提供了高效的代码…

Pytorch在二进制层面比较张量中的各行是否相同,并返回不相同的各行

代码实例&#xff1a; def unique(arr):# Finds unique rows in arr and return their indicesarr arr.cpu().numpy()arr_ np.ascontiguousarray(arr).view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[1])))_, idxs np.unique(arr_, return_indexTrue)if torch.cu…

代码随想录算法训练营 ---第五十一天

1.第一题&#xff1a; 简介&#xff1a; 本题相较于前几题状态复杂了起来&#xff0c;因为多了一个冷冻期。本题讲解可去代码随想录看&#xff0c;这里差不多只是加了些自己的理解。 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组以及下标的含义 dp[i][j]&#x…

C#文件流二进制文件的读写

目录 一、BinaryWriter类 二、BinaryReader类 三、示例 1.源码 2.生成效果 二进制文件的写入与读取主要是通过BinaryWriter类和BinaryReader类来实现的。 一、BinaryWriter类 BinaryWriter类以二进制形式将基元类型写入流&#xff0c;并支持用特定的编码写入字符串&#…

(五)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

使用Pytorch从零开始实现CLIP

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…

sublime Text使用

1、增加install 命令面板 工具(tool)->控制面板(command palette) -> 输入install ->安装第一个install package controller&#xff0c;以下安装过了&#xff0c;所以没展示 2、安装json格式化工具 点击install package&#xff0c;等几秒会进入控制面板&#xff0…

润申信息企业标准化管理系统 SQL注入漏洞复现

0x01 产品简介 润申信息科技企业标准化管理系统通过给客户提供各种灵活的标准法规信息化管理解决方案&#xff0c;帮助他们实现了高效的标准法规管理&#xff0c;完成个性化标准法规库的信息化建设。 0x02 漏洞概述 润申信息科技企业标准化管理系统 CommentStandardHandler.as…

高级I/O 基础概念

文章目录 什么是高级I/O五种常见高级I/O同步IO和异步IO多路转接是异步IO吗 什么是高级I/O 高级I/O&#xff08;Advanced I/O&#xff09;是指在计算机系统中进行输入和输出操作时使用的一种更高级的接口和技术。它提供了比传统的基本I/O操作更丰富和灵活的功能&#xff0c;以满…

echarts实现3D柱状图

效果如图 let setData function(data, constData, showData) {data.filter(function(item) {if (item) {constData.push(1);showData.push(item);} else {constData.push(0);showData.push({value: 1,itemStyle: {normal: {borderColor: "rgba(0,0,0,0)",borderWidt…

Day2 数组(二)

​ day2 2023.11.30 代码随想录 1. 977有序数组的平方 第二天做题就遇到点问题了&#xff0c;首先对于该题&#xff0c;简单的暴力平方排序肯定没问题&#xff0c;但一定不是我们要的最优解&#xff0c;我们争取在O(n)的时间复杂度内解决问题&#xff0c;发现对于一个初始数组…

传统算法:使用 Pygame 实现线性查找

使用 Pygame 模块实现了线性查找的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过线性查找算法对数组进行查找,动画效果可视化每一步的变化。在查找的过程中,程序逐个遍历数组元素,如果找到目标值,将相应的元素高…

HarmonyOS应用开发者基础认证试题

判断题 1.Ability是系统调度应用的最小单元&#xff0c;是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。(true) 2.Tabs组件仅可包含子组件TabsContent&#xff0c;每一个页签对应一个内容视图即TabContet组件。(true) 3.使用http模块发起网络请求时&#…