前言:
新学习OpenCV的人脸识别,用了别人的opencv3库发现没带CUDA模块,自己跟着网上教程编译个新的,结果编译完后DLL有700Mb大,不知道哪里没设置对,仅仅引用imgproc.hpp就占用了1GB的进程内存。尝试精简模块后再编译一次,在此收集CMAKE编译OPENCV时各选项的功能含义,用的是4.4.0版本。
选项命名规范
用于控制依赖库的选项有三种,分别有不同的前缀:
- WITH_:是否启用(enable or disable)此依赖。
- BUILD_:是否启用与 OpenCV 捆绑的第三方库的构建与使用。这将强制构建和使用自己的库,它们在某些平台上默认启用,例如 Windows。
- HAVE_:表明此依赖是否被启用,当自动检测无法使用时,可以用于手动启用一个依赖。
Opencv 第三方模块包含:
BUILD_CUDA_STUBS:默认关闭,如果系统中没有CUDA SDK,开启后将构建CUDA库。正常安装了CUDA的系统,并不需要开启此选项。
BUILD_DOCS:默认关闭,用于为OpenCV文档创建构建规则。构建必须安装 Doxygen 才能构建 C++ 文档。必须安装 Python 和 BeautifulSoup4 才能构建 Python 文档。 必须安装 Javadoc 和 Ant 才能构建 Java 文档(Java SDK 的一部分)。
BUILD_EXAMPLES:默认关闭,用于构建OpenCV库中的所有示例。这些示例可以在OpenCV上解压后的zip文件所在的samples文件夹中找到。
BUILD_IPP_IW:默认开启,添加Intel IPP集成包装的构建,可以为OpenCV的某些函数提供加速支持。
Intel(R) Integrated Performance Primitives Integration Wrappers是Intel开发的一套高性能数学函数库,使用英特尔® 集成性能原件 (英特尔® IPP) 提高多媒体、企业数据、嵌入式、通信和科学/技术应用程序的性能。
BUILD_ITT:默认开启,添加Intel ITT的构建。用于代码性能检测,比如游戏开发中关键性能数据收集。因为ITT API 有开销,不需要的可以关闭。
Intel (R) Instrumentation and Tracing Technology是一种用于分析和优化并行和多线程应用程序的工具,它可以帮助开发人员识别和解决并行程序中的性能问题。
BUILD_JASPER:默认开启,添加3rdparty/libjasper项目用于JPEG-2000 图像编解码的构建 。另见 WITH_JASPER 和 WITH_OPENJPEG 选项。
- jpeg 与 jpeg 2000 的区别是什么
JPEG2000是JPEG的升级版,其压缩率比JPEG高约30%左右,同时支持有损和无损压缩。 一个极其重要的特征在于它能实现渐进传输。JPEG 2000文件的副档名通常为.jp2,MIME类型是image/jp2。
-- OpenCV 进行图片压缩
BUILD_JAVA:默认开启,启用对 Java 包装器的构建。必须安装 Java SDK 和 Ant。
BUILD_JPEG:默认开启,添加JPEG格式文件编解码的构建。opencv库中自带了 对JPEG的编解码,其内部实质上是基于第三方库libjpeg进行解码的。基础的JPEG图片格式,基本都需要开启。
BUILD_OPENEXR:默认开启,添加EXR格式文件编解码的构建。编译3rdparty/openexr项目用于 HDR 图像编解码支持。
OpenEXR,或简称为exr格式,是一种开放标准的高动态范围图像格式,在计算机图形学里被广泛用于存储图像数据。OpenEXR最早由工业光魔开发,成了工业光魔主要使用的图像文件格式。 --度娘百科
BUILD_PACKAGE:默认开启,在版本2.3之前,你可以构建一个项目来构建OpenCV安装程序。这样你就可以轻松地在其他系统上安装你的OpenCV版本。对于OpenCV的最新源文件,它会生成一个新项目,该项目会创建一个包含OpenCV源文件的zip归档文件。
BUILD_PERF_TESTS:默认开启,包含许多针对OpenCV功能的性能测试。如果你关心性能问题,那么就构建并运行它们。
BUILD_PNG:默认开启。它是平台无关的,用C语言编写。它使用zlib来压缩和解压PNG文件。基础的PNG图片文件格式,基本都需要开启。
BUILD_PROTOBUF:默认开启,构建自己的 protobuf 库副本。如果要使用外部库则必须禁用此选项。WITH_PROTOBUF启用对 protobuf 库的搜索。OpenCV 可以构建自己的库副本或使用外部库。dnn 模块需要此依赖项,如果找不到则 dnn 模块将被禁用。
Protobuf (Protocol Buffers) 是Google开发的一种轻量级的数据交互格式,它允许开发者以结构化的方式定义数据,并将其高效地编码成字节流,便于在网络上传输。
-- OpenCV中protobuf模块
BUILD_TBB:默认关闭,添加Threading Building Blocks的构建。cmake生成vs工程时如果不是ARM处理器则会报出以下错误“BUILD_TBB option supports Windows on ARM only”,如果还是想要强行加上,可参考:Configuring CMake to build OpenCV on Windows — OpenCV 3.0 documentation
Threading Building Blocks 是一个用于并行编程的跨平台库,用于在多核处理器上加速图像处理和计算密集型任务。可以实现并行的图像处理,从而加快处理速度。例如,可以并行地对图像进行滤波、图像金字塔构建、特征提取等操作。
-- opencv的TBB模块
BUILD_TESTS:默认开启,添加OpenCV功能的准确性测试的构建。
BUILD_TIFF:默认开启,添加TIFF格式文件编解码的构建。用于处理*.tiff*格式的*libpng*和*libjpeg*库。
标签图像文件格式(Tag Image File Format,TIFF)是一种灵活的位图格式,主要用来存储包括照片和艺术图在内的图像,最初由Aldus公司与微软公司一起为PostScript打印开发。TIFF与JPEG和PNG一起成为流行的高位彩色图像格式。--度娘百科
BUILD_WEBP:默认开启,添加WEBP格式文件编解码的构建。
webp这种图片格式,是谷歌公司专门针对谷歌浏览器发布的一种全新的图片格式。
-- webp文件,转换成JPEG和PNG的几种方式
BUILD_WITH_DEBUG_INFO:默认关闭,添加在发布(Release)版本中启用调试符号的构建。
BUILD_WITH_DYNAMIC_IPP:默认关闭,添加用于控制IPP库的链接方式,如果选择了该选项,则IPP库会以动态链接库的形式被链接到目标程序中,否则IPP库会被静态链接到目标程序中。这个选项对于使用IPP库的开发者来说非常重要,因为它可以影响到程序的运行效率和可移植性。
IPP(Integrated Performance Primitives)是英特尔提供的一套高性能的函数库,主要用于多媒体、图像和信号处理等方面的开发。
BUILD_ZLIB:默认开启,添加zLib库的构建。zLib库对除PNG以外的各种图像格式都有用,因此,它可以在没有libpng的情况下使用。
zlib是一个广泛使用的数据压缩库,支持无损数据压缩和解压缩,由Jean-loup Gailly与Mark Adler所开发。
opencv 本体模块包含:
BUILD_opencv_apps:默认开启,构建OpenCV示例应用程序。不要示例的可以去掉。
BUILD_opencv_calib3d:默认开启,构建相机标定和三维重建模块。主要是相机校准和三维重建相关的内容。基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。提供了摄像机标定、立体视觉和三维重建的功能,包括相机参数估计、立体匹配、三维点云重建等。依赖于opencv_imgproc、opencv_features2d两个模块。
BUILD_opencv_core:默认开启,构建核心功能模块。必选模块。
BUILD_opencv_dnn:默认开启,构建深度学习模块。,主要包括构建神经网络、加载序列化网络模型等。人脸检测必选上。
BUILD_opencv_features2d:默认开启,构建特征检测和描述模块。主要为处理图像特征点,例如特征检测、描述与匹配等。
BUILD_opencv_flann:默认开启,构建快速最近邻搜索模块。Fast Library for Approximate Nearest Neighbors(快速近似最近邻库)的缩写,是高维的近似近邻快速搜索算法库,主要包含快速近似近邻搜索与聚类等。
BUILD_opencv_gapi:默认开启,构建通用图像处理模块。opencv4中新加模块,用来加速常规的图像处理,主要充当框架,并不是特定的计算机视觉算法。
OpenCV的Graph API(或称G-API)是一个让常规图像处理变得更快和轻量的新模块,目前正处在活跃的开发过程中,它的API现阶段是不稳定的,在未来或许会有一些微小但破坏兼容性的变化。
-- OpenCV Graph API初体验
BUILD_opencv_highgui:默认开启,构建图形用户界面模块。高层GUI,包含创建和操作显示图像的窗口、处理鼠标事件和键盘命令、提供图形交互可视化界面等。必选。
BUILD_opencv_imgcodecs:默认开启,构建图像编解码模块,主要用于图像文件的读取与保存。BMP、HDR (WITH_IMGCODEC_HDR)、Sun Raster (WITH_IMGCODEC_SUNRASTER)、PPM, PGM, PBM, PFM (WITH_IMGCODEC_PXM, WITH_IMGCODEC_PFM)不需要任何第三方库的帮助,而PNG, JPEG, TIFF, WEBP 的支持则需要使用对应的BUILD_进行构建。
BUILD_opencv_imgproc:默认开启,构建图像处理模块。主要包括图像滤波、几何变换、直方图、特征检测与目标检测等。
BUILD_opencv_java_bindings_generator:默认开启,JAVA相关库,不需要的可以去除。
BUILD_opencv_js:默认关闭,JavaScript相关库,不需要的可以去除。
BUILD_opencv_ml:默认开启,构建机器学习模块,基本上是统计分类、回归和数据聚类等。
BUILD_opencv_objdetect:默认开启,构建目标检测模块。包含Cascade Classification(级联分类)和Latent SVM这两个部分,包括Haar特征分类器、级联分类器等。
BUILD_opencv_photo:默认开启,构建计算摄影模块,主要包含图像修复、去噪点和图像增强。
BUILD_opencv_python_bindings_generator:默认开启,PYTHON相关库,不需要的可以去除。
BUILD_opencv_python_test:默认开启,PYTHON相关库的示例,不需要的可以去除。
BUILD_opencv_stitching:默认开启,构建图像拼接模块。主要包含特征点寻找与匹配图像、估计旋转、自动校准、接缝估计等图像拼接相关内容。
BUILD_opencv_ts:默认开启,用于构建OpenCV的测试模块(Test Suite)。
测试模块是用于验证OpenCV库的正确性和稳定性的一组测试用例。这些测试用例可以帮助开发人员在开发和修改OpenCV代码时进行自动化测试,以确保代码的正确性和功能的稳定性。
BUILD_opencv_video:默认开启,构建视频分析模块。主要包含运动估计、背景分离、对象跟踪等内容。
BUILD_opencv_videoio:默认开启,构建视频输入/输出模块。主要用于读取/写入视频或者图像序列。
BUILD_opencv_world:默认关闭。勾选时,构建包含所有模块的单个动态库。这个基本都是必勾选的。
opencv 选项设置
CV_DISABLE_OPTIMIZATION:默认关闭,开启则禁用所有可能的内置优化。
CV_ENABLE_INTRINSICS:默认开启,启用底层硬件指令优化,加快运行速度。取消勾选则禁用通用内部函数,以便进行故障排除和调试。
CV_TRACE:默认开启,启用OpenCV跟踪功能,可以输出调试信息到控制台。
ENABLE_CCACHE:在WIN平台默认关闭,在类Unix平台默认开启,启用 ccache 自动检查。该工具包装编译器调用并缓存结果,可以显著地缩短重新编译的时间。
ccache是一个gcc/g++的c语言编译器缓存,基于单条gcc编译命令级别颗粒,将本次编译命令的产物,复制并压缩一份到缓存目录中,下次编译的时候, 如果检测到相同编译命令,并且没有修改输入的源文件,则直接读取缓存目录中上次编译流程,省去编译时间,从而优化编译时长。
ENABLE_FAST_MATH:默认关闭,计算加速模块,启用针对浮点计算的快速数学优化编译器选项(官方文档不推荐?)。
ENABLE_FLAKE8:启用文档或示例时默认开启,启用 Flake8 对 python 脚本进行检查(check_flake8 目标)。必须安装 Flake8。
ENABLE_INSTRUMENTATION:默认关闭,开启后配合Opencv的性能检测框架,跟踪函数实现中的执行时间权重。
ENABLE_LTO:默认关闭,用于启用或禁用链接时优化(Link Time Optimization,简称LTO)。
链接时优化是一种编译器优化技术,它在链接阶段对整个程序进行优化,而不仅仅是对单个源文件进行优化。通过启用LTO,编译器可以对整个OpenCV库进行全局优化,从而提高代码的执行效率和性能。如果设置ENABLE_LTO为ON,则会启用链接时优化;如果设置为OFF,则禁用链接时优化。启用LTO可能会增加编译时间和内存消耗,但可以提高生成的OpenCV库的执行效率。因此,根据具体需求和编译环境,可以选择是否启用ENABLE_LTO选项。
ENABLE_THIN_LTO:默认关闭,仅限Clang启用 Thin LTO,它将中间代码合并到二进制文件中,允许稍后优化应用程序。
ENABLE_PIC:生成与位置无关的代码,对于共享库是必需的,即当勾选 BUILD_SHARED_LIBS 时默认开启。
ENABLE_PRECOMPILED_HEADERS:默认开启,启用预编译头文件,改进构建时间。
ENABLE_PYLINT:默认关闭,启用 Pylint 对 python 脚本进行检查(check_pylint 目标)。必须安装 Pylint。
ENABLE_SOLUTION_FOLDER:默认开启,启用在Visual Studio IDE中使用解决方案文件夹。这个文件夹是你想使用OpenCV做的项目的容器。
INSTALL_CREATE_DISTRIB:默认关闭,开启后调整多项以生成 Windows 和 Android 发行版。
INSTALL_C_EXAMPLES:默认关闭,开启后安装samples/cpp 目录中的 C++ 示例源代码。
INSTALL_TESTS:默认关闭,开启后将安装准确性和性能测试二进制文件和测试数据。(必须启用 BUILD_TESTS 选项)。
OPENCL_FOUNE:默认开启,是否查找使用openCL。
开放计算语言 (OpenCL) 是一种开放标准,为应用程序提供了对 GPU 的访问,用于非图形计算 (GPGPU)。 在计算机视觉中,许多算法可以在 GPU 上比在 CPU 上更有效地运行:例如 图像处理、矩阵运算、计算摄影、物体检测等。
-- OpenCV算法加速(3)使用OpenCL、G-API及Halide等等
OPENCV_DNN_CUDA:默认关闭,启用 CUDA 后端。必须安装 CUDA、CUBLAS 和 CUDNN。要使用cuda的话必选。
OPENCV_DNN_OPENCL:默认开启,用于控制是否启用OpenCL加速的深度学习模块(DNN)。启用OpenCL加速可以提高深度学习模型推理的速度,特别是在使用支持OpenCL的GPU时。但需要注意的是,启用OpenCL加速需要确保系统支持OpenCL,并且安装了相应的OpenCL驱动程序。如果系统不支持OpenCL或者没有安装OpenCL驱动程序,那么即使设置了OPENCV_DNN_OPENCL为ON,也无法启用OpenCL加速的DNN模块。
OPENCV_ENABLE_NONFREE:默认关闭,库中包含的一些算法已知受专利保护。nonfree 相关的算法对应的模块为xfeatures2d ,不在opencv包中,在相对应的 opencv_contrib 附件包中,第三方里面有不免费的东西,所以编译拓展包时需要勾选。
OPENCV_EXTRA_MODULES_PATH:指定额外模块的路径,用于构建OpenCV的扩展模块。如需添加opencv-contrib时,在此选择文件夹"xxxx/opencv-contrib-x.x.x/modules"。
OPENCV_FORCE_3RDPARTY_BUILD:默认关闭,开启后立即启用所有BUILD_ 选项。
OPENCV_GENERATE_PKGCONFIG:默认关闭,开启后为pkg-config构建工具生成pc文件。该文件对于不使用 CMake 进行构建的项目很有用。
Pkg-config是在编译应用程序和库时使用的工具。它将帮助您在命令行上提供正确的编译器选项,即它将找到软件编译所需的已安装库。
OPENCV_GENERATE_SETUPVARS:默认开启,用于指定生成用于设置OpenCV环境变量的文件。当开启时,CMake会在安装OpenCV时生成一个名opencv_generated_setupvars.cmake的文件。这个文件包含了设置环境变量所需的命令,比如将OpenCV的路径添加到PATH环境变量中,以便在编译和运行时能够正确地找到OpenCV库和头文件。
WITH_1394:默认开启,使用 DC1394 库对 IIDC IEEE1394 的支持。
1394接口是IEEE1394接口的简称,也称Firewire火线接口,是一种串行数据传输协议接口,主要用于图像、音视频采集和设备之间数据传输,同时可以为相关设备提供电源。
LibDC1394 允许程序通过 IEEE 1394 连接访问高速视频数据,并将其转换为适合 OpenCV 使用的格式。然而,随着技术的发展,现在许多新设备都使用 USB 或者 Ethernet 接口,以及更高性能的视频编码技术,因此 LibDC1394 的使用逐渐减少。
WITH_ADE:默认开启,OpenCV的gapi模块的编译依赖ADE,在OpenCV的build过程中会自动下载ADE。
Ade(Adaptable Dependency Manager)主要用于解决C++项目中依赖管理的问题,尤其是在复杂的软件开发环境中,它能够帮助开发者更方便地管理和更新项目的依赖项。
WITH_CLP:默认关闭,开启后将添加对 videostab 模块所需的 coinor 线性编程(coinor linear programming)库的构建支持。请确保安装 coinor-clp 的开发库。
WITH_CUDA:默认关闭,开启后允许CUDA支持。需要预先安装 CUDA toolkit。必须先从 NVIDIA 官网安装 CUDA toolkit。 对于低于 3.9 的 CMake 版本,OpenCV 使用自己的 cmake / FindCUDA.cmake
脚本,而对于较新的 CMake 版本,OpenCV 使用与 CMake 一起打包的版本。要使用GPU CUDA的必开启。
WITH_DIRECTX:默认开启,开启后允许微软对OpenCV的DirectX支持。它是一个应用程序编程接口(api)的集合,用于处理与多媒体相关的任务,特别是在微软平台上的游戏编程和视频。
WITH_DSHOW:默认开启,此后端使用较旧的 DirectShow 框架。 它只能用于从相机捕获帧。 现在不推荐使用它以支持 MSMF 后端,尽管两者可以在同一个构建中同时启用。
cv2.VideoCapture(camera_number + cv2.CAP_DSHOW) 是OpenCV在Windows平台下用于指定使用DirectShow作为视频捕获后端的一种方式。
-- OpenCV打开摄像头或视频
WITH_EIGEN:默认开启,启用OpenCV的特征库支持。它是一个用于线性代数矩阵和向量操作、几何变换、数值求解器和相关算法的模板头的高级C库。
WITH_FFMPEG:默认开启,启用 FFmpeg 库集成,用于解码和编码视频文件和网络流。 这个库可以读写许多流行的视频格式。需要提前安装 avcodec、、avformat、avutil、swscale、avresample (可选)。
WITH_FREETYPE:默认关闭。若要使用putText在图片中添加中文汉字,则需要编译freetype和harfbuzz,若没有中文汉字的需求,则可以关闭。
WITH_GDAL:默认关闭,勾选后启用GDAL库集成。将使用 CMake 包机制搜索此库,确保已正确安装或手动设置 GDAL_DIR
环境或 CMake 变量。
Geospatial Data Abstraction Library (GDAL)是一个用于读取和写入栅格和矢量地理空间数据格式的计算机软件库,并在开源地理空间基金会(Open SourceGeospatial Foundation)的X/MIT风格自由软件许可下发布。作为一个更高级别的库,支持读取多种文件格式,包括 PNG、JPEG 和 TIFF。 打开文件时它将具有更高的优先级,并且可以覆盖其他后端。
WITH_GDCM:默认关闭,勾选后通过 GDCM 库启用 DICOM 医学图像格式支持。 将使用 CMake 包机制搜索此库,确保已正确安装或手动设置 GDCM_DIR
环境或 CMake 变量。
在医学影像领域中,DICOM格式是非常重要的一种图像格式。而实现DICOM图像的读取与处理,则需要使用到专门的图像处理库。其中,GDCM(Grassroots DiCoM)是一种轻量级的、开源的、跨平台的C++库,用于实现DICOM协议的通信和图像数据的处理。
-- GDCM:使用gdcm::Image实现DICOM图像读取与处理
WITH_GSTREAMER:默认开启,启用与 GStreamer 库的集成,用于解码和编码视频文件、从摄像机和网络流中捕获帧。 可以安装许多插件来扩展支持的格式列表。OpenCV 允许运行作为字符串传递给 cv::VideoCapture 和 cv::VideoWriter 对象的任意 GStreamer 管道。
GStreamer是一个用于构建媒体处理组件图的库。它支持的应用范围从简单的Ogg/Vorbis播放,音频/视频流到复杂的音频(混合)和视频(非线性编辑)处理。
WITH_HALIDE:默认关闭,使用实验性的 Halide 后端,它可以在运行时为 dnn 层生成优化的代码。必须安装 Halide。
Halide是一个开源项目,它让我们以易读的格式编写图像处理算法,根据特定的设备调度计算,并以相当好的效率评估它。
WITH_HPX:默认关闭,High Performance ParallelX 是一个实验性后端,更适合多处理器环境。
HPX (High Performance ParalleX)是一个通用的C运行时系统,适用于任何规模的并行和分布式应用程序。这个库严格遵循C 11标准,并利用了Boost C库,这使得HPX易于使用,高度优化,并且非常可移植。HPX是为传统架构开发的,包括基于linux的系统、Windows、Mac和BlueGene/Q,以及Xeon Phi等加速器。
WITH_IMGCODEC_HDR:默认开启,启用HDR格式的读取。此格式可以直接被 OpenCV 读取而不需要任何第三方库的帮助。
高动态范围成像(英语:High Dynamic Range Imaging,简称HDRI或HDR),在计算机图形学与电影摄影术中,是用来实现比普通数位图像技术更大曝光动态范围(即更大的明暗差别)的一组技术。 -- 度娘百科
WITH_IMGCODEC_PFM、WITH_IMGCODEC_PXM:默认开启,启用PPM, PGM, PBM, PFM 格式的读取。这些格式可以直接被 OpenCV 读取而不需要任何第三方库的帮助。
PPM 是以 Portable Pixmap 格式保存的未压缩彩色图像文件的文件扩展名。 PPM 图像格式支持 0 到 255 RGB 颜色,文件可以以文本或二进制格式写入。PPM文件的后缀名为”.ppm”。PPM 是通过RGB三种颜色显现的图像(pixmaps)。
PGM 是Portable Gray Map的缩写,它是灰度图像格式中一种最简单的格式标准。PGM文件的后缀名为”.pgm”。PGM 是灰度图(grayscale)。
PBM 是位图(bitmap),仅有黑与白,没有灰。
WITH_IMGCODEC_SUNRASTER:默认开启,启用Sun Raster 格式的读取。此格式可以直接被 OpenCV 读取而不需要任何第三方库的帮助。
WITH_INF_ENGINE:默认关闭,自 OpenVINO 2022.1 起已弃用。启用英特尔推断引擎 (Intel Inference Engine, IE)后端。允许以 IE 格式 (.xml + .bin)来运行网络。推断引擎必须作为 OpenVINO toolkit 的一部分安装,或者作为从源代码构建的独立库安装。
WITH_IPP:默认开启,启用Intel IPP功能。见 BUILD_IPP_IW 和 BUILD_WITH_DYNAMIC_IPP。
WITH_ITT:见BUILD_ITT,默认开启,启用ITT,不需要就一起关了。
WITH_JASPER:默认开启,启用JasPer的JPEG-2000 图像编解码。需要关闭WITH_OPENJPEG才生效。
OpenJPEG 的优先级高于已弃用的 JasPer。 要使用 JasPer,必须禁用 OpenJPEG。
WITH_JPEG:默认开启,启用JPEG格式的支持。
WITH_LAPACK:默认开启,启用Lapack数学库。
LAPACK(线性代数包)是Oak Ridge 国家实验室、加州大学Davis 分校和Illinois 大学等联合开发的线性代数函数库,用Fortran 90编写的,提供了求解线性方程组、线性方程组的最小二乘解、特征值问题和奇异值问题的例程。
WITH_LIBREALSENSE:默认关闭,勾选后启用对 RealSense 摄像头的支持。需要安装realsense驱动。
WITH_MFX:默认关闭,勾选后启用MediaSDK 库,可用于原始视频流的硬件加速解码和编码。
WITH_MSMF:默认开启,启用使用 Windows 的内置媒体基础框架(Windows’ built-in Media Foundation framework)的 MSMF 后端。 可用于从相机捕获帧,解码和编码视频文件。
WITH_MSMF_DXVA:默认开启,启用MSMF 后端的硬件加速处理支持。
WITH_OPENCL:默认开启,启用OpenCL支持,是启用其他openCL功能的前提。
WITH_OPENCLAMDBLAS:默认开启,启用AMD提供的的 OPENCL GPU并行BLAS线性代数库支持。
BLAS(basic linear algebra subroutine)(基本线性代数子程序)是提供用于执行基本向量和矩阵运算的标准构建块的例程。
WITH_OPENCLAMDFFT:默认开启,启用AMD提供的 OPENCL GPU并行快速傅里叶变化支持。
WITH_OPENCL_D3D11_NV:默认开启,启用NVIDIA提供的OPENCL D3D11 GPU 并行计算支持。
WITH_OPENCL_SVM:默认关闭,勾选后启用OPENCL共享虚拟内存支持。
WITH_OPENEXR:默认开启,启用EXR格式的读取。见 BUILD_OPENEXR 。
WITH_OPENGL:默认关闭,勾选后启用OpenGL支持。OpenGL 集成可用于与GTK、WIN32 和 Qt后端一起绘制硬件加速窗口,并启用与 OpenGL 的基本互操作性。
OpenGL是一个用于渲染三维场景的库。这些3D场景之后可以使用OpenCV库以图像和视频的形式进行处理。
WITH_OPENJPEG:默认开启,启用OpenJPEG的JPEG-2000 图像编解码。优先级高于JASPER。
WITH_OPENMP:默认关闭,勾选后启用OpenMP API 支持。
OpenMP是一种应用于多处理器程序设计的并行编程处理方案,它提供了对于并行编程的高层抽象,只需要在程序中添加简单的指令,就可以编写高效的并行程序,而不用关心具体的并行实现细节,降低了并行编程的难度和复杂度。
-- 【opencv+OpenMP】OpenMP并行编程应用—加速OpenCV图像拼接算法
WITH_OPENNI:默认关闭,已弃用。OpenNI 可用于从深度感应相机捕获数据。
WITH_OPENNI2:默认关闭,OpenNI2 可用于从深度感应相机捕获数据。
WITH_OPENVX:默认关闭,勾选后启用OpenVX标准。
OpenVX像一个骨架,只有一些头文件声明,目的在于方便不同的硬件平台,实现相同的接口,在嵌入式和实时性系统中可以更好地发挥它的优势,在某些场合配合OpenCV的强大功能可以实现更好的效果。
-- OpenVX原理与技术杂谈
WITH_PLAIDML:默认关闭,勾选后启用PlaidML库。
PlaidML 致力于跨平台开发部署的开源高性能深度学习框架,目前PlaidML支持Keras,OpenCL,Linux,macOS和Windows的支持。最重要的是PlaidML 可以使用AMD的显卡在windows平台上进行深度学习。
-- 开源深度学习框架PlaidML安装及测试 一
WITH_PNG:默认开启,启用PNG格式的支持。
WITH_PROTOBUF:默认开启,启用对 protobuf 库的搜索。OpenCV 可以构建自己的库副本或使用外部库。dnn 模块需要此依赖项,如果找不到则 dnn 模块将被禁用。
WITH_PVAPI:默认关闭,PVAPI 是用于 Prosilica GigE 相机的旧版 SDK。 已弃用。
WITH_QT:默认关闭,勾选后启用Qt支持。
Qt是一个跨平台的桌面、嵌入式和移动应用程序开发框架。Qt本身并不是一种编程语言。它是一个用C语言编写的框架。有了Qt, gui可以直接用C语言编写,使用它的Widgets模块。Qt还提供了一个交互式图形工具*Qt Designer*,它可以作为基于gui的部件的代码生成器。
WITH_QUIRC:默认开启,启用Quirc库。
Quirc是一个基于C/C++的一个二维码库,简单的来概括Quirc的特点就是:简单,方便移植,识别准确率高。
-- C/C++使用Quirc库解析二维码(QRcode)
WITH_TBB:默认关闭,勾选后启用Intel TBB支持。见 BUILD_TBB。
WITH_TIFF:默认开启,启用TIFF格式的支持。
WITH_VTK:默认开启,启用VTK支持。
VTK是一个用于可视化的开源工具包,专注于三维可视化。它能够将复杂的数据(如医学图像、科学模拟数据)转化为直观、交互式的三维图像。
WITH_VULKAN:默认关闭,勾选后启用实验性 Vulkan 后端。不需要附加依赖项,但可以使用外部 Vulkan 头文件(VULKAN_INCLUDE_DIRS)。
Vulkan是Khronos组织制定的“下一代”开放的图形显示API。是与DirectX12能够匹敌的GPU API标准,提供了能直接控制和访问底层GPU的显示驱动抽象层。
-- 图形程序接口知多少|
WITH_WEBP:默认开启,启用WBEP格式的支持。
WITH_WIN32UI:默认开启,启用WinAPI 。WinAPI 是 Windows 中的标准 GUI API。
WITH_XIMEA:默认关闭,勾选后启用对 XIMEA 相机的支持。
CMAKE生成设置部分:
BUILD_SHARED_LIBS:默认开启,构建共享库(动态库.so.dll);取消勾选时,构建静态库(.a.lib)。
BUILD_WITH_STATIC_CTR:默认开启,构建静态运行时库(MT/MTd);取消勾选时,构建动态运行时库(MD/MDd)。
CMAKE_BUILD_TYPE:指定构建类型,默认Debug+Release。
CMAKE_INSTALL_PREFIX:指定安装目录,默认自动生成。
CUDA+contrib拓展模块设置:
添加opencv-contrib拓展库并勾选了构建CUDA库之后,点击一次Configure,将生成拓展模块选项,还另外需要勾选上 CUDA_FAST_MATH 。
CUDA_FAST_MATH:开启后可以以精度为代价加快某些计算工作的速度。
CUDA_ARCH_BIN:显卡算力值,列举的值越少编译越快,可以官网查。常见10系显卡算力6.1,20系显卡算力7.5,30系显卡算力8.6,40系显卡算力8.9。【CUDA GPU | NVIDIA 开发者】您的 GPU 计算能力
实操设置:
由于我没有用opencv读取摄像头和视频文件的需求,去掉视频拉取相关的模块;用的C++,去掉了py\java\js相关库;去掉了例程、测试模块;显卡是2060,但仍预留了10系的算力值。配置后提示找不到BLAS与LAPACK、Julia、gflags、flog,查了一下要另外安装对应的库,既然CMAKE没有标红那就无视这些模块了。
原本想预留30系的算力值的,但是发现如果填入了初始配置时自动生成的算力值之外的数值,VS项目编译会报错。
下面是我的CMAKE配置:
仅添加拓展包而不勾选OPENCV_DNN_CUDA,会生成以下选项:
再加上CUDA,会生成以下选项:
最后编译出来的opencv_world.dll有300MB大,Debug版400MB大,程序内也不会仅引用头文件就占用1GB内存了。
我觉得dll还是大了点,又去掉了BUILD_TIFF、BUILD_OPENEXR、WITH_IMGCODEC_HDR、WITH_IMGCODEC_SUNRASTER、WITH_IMGCODEC_PFM、WITH_IMGCODEC_PXM等文件格式的支持,取消dx的支持(WITH_DIRECTX),算力仅用20系的,生成的DLL大小缩减到200MB,跑cv::face没有问题。
如果不考虑生成的库还要复用到其他项目需求上,可以针对单独项目需求继续减少不需要的算法模块,特别是CUDA相关库目前是全选的状态。
跑了一个别人的YOLO项目,光实例化YOLO自定义类怎么就占了5G进程内存啊,跑1080p图像识别更是飙到8G内存,我怀疑不再增加是因为达到64位程序的上限了。
文章引用:
OPENCV 编译选项以及解释
OpenCV编译知识点备忘
OpenCV 配置选项参考文档
OpenCV4.3+VS2017+外部库 win10 64位手动编译x64库
opencv3.4.1 —— cmake相关参数作用
文章参考:
OpenCV实战应用必备技能 | 模块裁剪
裁剪opencv库到2Mb
【官方文档】OpenCV configuration options reference
opencv编译选项,运行最快的组合