行业新闻

使用cmake编译opencv过程中的可选参数说明

2024-02-12 阅读次数:

文章目录

环境说明

  • opencv版本:4.5.5

介绍

通过源码编译opencv时,cmake可以带有很多可选参数,这里对这些可选参数进行说明。
配置选项可以通过几种不同的方式设置:

  • 命令行:cmake-Doption=value…
  • 初始缓存文件:cmake-C my_options.txt…
  • 通过Cmake-GUI进行设定

在本参考中,我们将使用常规命令行。

# 初始化配置文件
cmake ../opencv
# 打印所有选项
cmake -L
# 打印所有选项,附带说明文档
cmake -LH
# 打印所有选项,包括高级
cmake -LA

最常用和有用的是以with_、ENABLE_、BUILD_、OPENCV_开头的选项。默认值因平台和其他选项值而异。

常规选项

1.Build with extra modules

OPENCV_EXTRA_MODULES_PATH选项包含一个分号分隔的目录列表,其中包含将添加到生成中的额外模块。模块目录必须具有兼容的布局和CMakeList.txt。仅支持0级和1级深层模块位置。

# 使用opencv_contrib中的所有模块进行构建
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv
# 使用opencvcontrib模块之一构建
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/bgsegm ../opencv
# 使用两个自定义模块构建(必须在bash中转义分号)
cmake -DOPENCV_EXTRA_MODULES_PATH=../my_mod1\;../my_mod2 ../opencv

2.Debug build

CMAKE_BUILD_TYPE选项可用于启用调试构建;生成的二进制文件将包含调试符号,大多数编译器优化将被关闭。若要在Release build中启用调试符号,请启用build_WITH_debug_INFO选项。
在某些平台(如Linux)上,必须在配置阶段设置构建类型:

cmake -DCMAKE_BUILD_TYPE=Debug ../opencv
cmake --build .

在其他平台上,可以在同一构建目录(例如Visual Studio、XCode)中生成不同类型的构建:

cmake <options> ../opencv
cmake --build . --config Debug

如果您使用GNU libstdc++(GCC的默认值),您可以启用ENABLE_GNU_STL_DEBUG选项,那么C++库将在调试模式下使用,例如,索引将在向量元素访问期间进行绑定检查。可以使用CV_DISABLE_OPTIMIZATION选项禁用多种优化:

  • 一些第三方库(例如IPP、Lapack、Eigen)
  • 显式矢量化实现(通用内部函数、原始内部函数等)
  • 调度的优化
  • 显式循环展开

3.Static build

BUILD_SHARED_LIBS选项控制是生成动态(.dll,.so,.dylib)库还是静态(.a,.lib)库。默认值取决于目标平台,在大多数情况下为on。

cmake -DBUILD_SHARED_LIBS=OFF ../opencv

ENABLE_PIC设置CMAKE_POSITION_INDEPENDENT_CODE选项。它启用或禁用“位置无关代码”的生成。在构建动态库或要链接到动态库的静态库时,必须启用此选项。默认值为ON。

4.Generate pkg-config info

OPENCV_GENERATE_PKGCONFIG选项启用.pc文件生成以及标准CMake包。此文件对于不使用CMake进行生成的项目非常有用。

cmake -DOPENCV_GENERATE_PKGCONFIG=ON ../opencv

5.Build tests, samples and applications

有两种测试:准确性(opencv_test_)和性能(opencv_perf_)。默认情况下启用测试和应用程序。默认情况下未生成示例,应显式启用。相应的cmake选项:

cmake \
  -DBUILD_TESTS=ON \
  -DBUILD_PERF_TESTS=ON \
  -DBUILD_EXAMPLES=ON \
  -DBUILD_opencv_apps=ON \
  ../opencv

6.Build limited set of modules

每个模块都是模块目录的子目录。可以禁用一个模块:

cmake -DBUILD_opencv_calib3d=OFF ../opencv

相反的选择是只构建指定的模块及其依赖的所有模块:

cmake -DBUILD_LIST=calib3d,videoio,ts ../opencv

在本例中,我们请求了3个模块,配置脚本已自动确定所有依赖项:

--   OpenCV modules:
--     To be built:                 calib3d core features2d flann highgui imgcodecs imgproc ts videoio

7.依赖库下载

配置脚本可以尝试从internet下载其他库和文件,如果失败,相应的功能将被关闭。在某些情况下,可能会发生配置错误。默认情况下,所有文件都首先下载到/。缓存目录,然后解压缩或复制到构建目录。可以通过设置环境变量或配置选项来更改下载缓存位置:

export OPENCV_DOWNLOAD_PATH=/tmp/opencv-cache
cmake ../opencv
# or
cmake -DOPENCV_DOWNLOAD_PATH=/tmp/opencv-cache ../opencv

如果通过代理访问,则应在运行cmake之前设置相应的环境变量:

export http_proxy=<proxy-host>:<port>
export https_proxy=<proxy-host>:<port>

下载过程的完整日志可以在构建目录-CMakeDownloadLog.txt中找到。此外,对于每次失败的下载,将向构建目录中的助手脚本添加一个命令,例如download_with_wget.sh。用户可以按原样运行这些脚本或根据需要进行修改。

功能特性和相关性

有许多可选的依赖项和功能可以打开或关闭。cmake有一个特殊的选项,允许打印所有可用的配置参数:

cmake -LH ../opencv

有三种选项用于控制库的依赖关系,它们具有不同的前缀:

  • 以with_启用或禁用依赖项开始的选项
  • 从BUILD_启用或禁用构建以及使用OpenCV附带的第三方库开始的选项
  • 以HAVE_开头的选项表示已启用依赖项,如果无法使用自动检测,则可以使用该选项手动启用依赖项。

启用WITH_选项时:

  • 如果BUILD_选项已启用,将构建第三方库并启用=>HAVE_设置为ON
  • 如果BUILD_选项被禁用,则第三方库将被检测并启用(如果找到)=>HAVE_设置为ON(如果找到依赖项)

1.CUDA支持

WITH_CUDA (default: OFF)

许多算法已经使用CUDA加速实现,这些功能位于单独的模块中。CUDA工具包必须从NVIDIA官方网站安装。对于早于3.9的cmake版本,OpenCV使用自己的cmake/FindCUDA。cmake脚本,用于较新版本-与cmake一起打包的版本。其他选项可用于控制构建过程,例如CUDA_GENERATION或CUDA_ARCH_BIN。这些参数尚未记录,请咨询cmake/OpenCVDetectCUDA。cmake脚本获取详细信息。

2.OpenCL支持

WITH_OPENCL (default: ON)

多种OpenCL加速算法可通过所谓的“透明API(T-API)”获得。此集成在用户级别使用与常规CPU实现相同的功能。如果输入和输出图像参数作为不透明的cv::UMat对象传递,则切换到OpenCL执行分支。更多信息可以在简介和OpenCL支持中找到
在构建时,此功能没有任何先决条件。在运行时,需要一个工作的OpenCL运行时,运行clinfo和/或opencv_version–OpenCL命令来检查它。OpenCL集成的一些参数可以使用环境变量进行修改,例如OPENCV_OpenCL_DEVICE。然而,还没有关于该特性的完整文档,因此请检查modules/core/src/ocl中的源代码。有关详细信息,请参阅cpp文件。

3.图像读写(imgcodecs module)

OpenCV可以在没有任何第三方库帮助的情况下读取以下格式:

  • BMP
  • HDR (WITH_IMGCODEC_HDR)
  • Sun Raster (WITH_IMGCODEC_SUNRASTER)
  • PPM, PGM, PBM, PFM (WITH_IMGCODEC_PXM, WITH_IMGCODEC_PFM)

读取这些格式图像所需的所有库都包含在OpenCV中,如果在配置阶段找不到,将自动构建。相应的BUILD_*选项将强制构建和使用自己的库,它们在某些平台(例如Windows)上默认启用。

(1)GDAL integration
WITH_GDAL (default: OFF)

GDAL是一个更高级别的库,支持读取多种文件格式,包括PNG、JPEG和TIFF。它在打开文件时具有更高的优先级,并且可以覆盖其他后端。将使用cmake包机制搜索此库,确保正确安装或手动设置GDAL_DIR环境或cmake变量。

(2)GDCM integration
WITH_GDCM (default: OFF)

通过GDCM库启用DICOM医学图像格式支持。将使用cmake包机制搜索此库,确保正确安装或手动设置GDCM_DIR环境或cmake变量。

4.视频读写 (videoio module)

(1)Video4Linux
WITH_V4L (Linux; default: ON )

使用Video4Linux API从相机捕获图像。必须安装Linux内核标头。

(2)FFmpeg
WITH_FFMPEG (default: ON)

与FFmpeg库集成,用于解码和编码视频文件和网络流。这个库可以读写许多流行的视频格式。它由几个组件组成,这些组件必须作为构建的先决条件安装:

  • avcodec
  • avformat
  • avutil
  • swscale
  • avresample (optional)

例外情况是Windows平台,其中包含FFmpeg的预构建插件库将在配置阶段下载,并与所有生成的库一起复制到bin文件夹。

(3)GStreamer
WITH_GSTREAMER (default: ON)

支持与GStreamer库集成,用于解码和编码视频文件,从摄像机和网络流中捕获帧。可以安装许多插件来扩展支持的格式列表。OpenCV允许运行作为字符串传递给cv::VideoCapture和cv::Video Writer对象的任意GStreamer管道。各种GStreamer插件在不同平台上提供硬件加速视频处理。

(4)Microsoft Media Foundation
WITH_MSMF (Windows; default: ON)

启用使用Windows内置Media Foundation框架的MSMF后端。可用于从相机捕获帧,解码和编码视频文件。此后端具有硬件加速处理支持(WITH_MSMF_DXVA选项,默认为ON)。

(5)DirectShow
WITH_DSHOW (Windows; default: ON)

此后端使用旧的DirectShow框架。它只能用于从相机捕捉帧。它现在被弃用,转而支持MSMF后端,尽管两者都可以在同一版本中启用。

(6)AVFoundation
WITH_AVFOUNDATION (Apple; default: ON)

AVFoundation框架是苹果平台的一部分,可用于从相机捕获帧、编码和解码视频文件。

(7)Other backends

有多种不太流行的框架可以用来读写视频。每个都需要安装相应的库或SDK。

5.多线程后端支持

一些OpenCV算法可以使用多线程来加速处理。OpenCV可以使用线程后端之一构建。

OpenCV可以从GitHub下载并构建TBB库,该功能可以通过build_TBB选项启用。

6.GUI界面显示后端支持 (highgui module)

OpenCV依赖于各种GUI库来绘制窗口。

7.深度学习神经网络后端支持(dnn module)

OpenCV有自己的DNN推理模块,它有自己的内置引擎,但也可以使用其他库进行优化处理。可以在单个构建中启用多个后端。选择在运行时自动或手动进行。

8.库安装与位置

选项可用于控制是否安装库的一部分:

以下选项允许相对于安装前缀修改组件的安装位置。这些选项的默认值取决于平台和其他选项,请检查cmake/OpenCVInstallLayout。cmake文件获取详细信息。

9.其他功能