很多朋友在 Linux 系统中为 C++ 程序安装 OpenCV (从源代码生成)时经常会遇到各种各样的问题,尤其是对 C++ 生成系统或 Linux 不熟的情况下就更难以完成了。我也是被问得太烦了,干脆写一篇文章来行详解。其实也不怎么复杂,主要是大家对这种事情没什么耐心罢了,严格按下文介绍的步骤操作,基本没有不成功的。
如果你只在 Python 中调用 OpenCV ,完全可以使用 pip 命令安装任意版本:
python3 –m pip install opencv–python==<VERSION>
本文以下内容所介绍的是从源代码生成并安装 OpenCV 的方法,这样安装的 OpenCV 具有以下特点:
提供 C/C++ 程序调用接口,并可选择是否支持 Python,
可以任意删除不需要的组件,避免安装过多的系统依赖,减小空间占用,
可自由配置生成选项,实现更换底层库、生成共享/静态库、构建纯单线程版本等定制化需求,
生成和安装完成后,你会得到指定安装路径下的 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
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 的生成,这哥俩的版本号必须严格一致。
四、依赖项
编译系统 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_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 .. -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(
原文地址:https://blog.csdn.net/weixin_46529898/article/details/134607813
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_20962.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!