opencv官网
opencv Github
opencv有两种安装方式:1、根据自己的平台选择官方编译好的版本;2、下载源码自己编译。
官方预编译版本满足大多数需求。预编译版本有两个途径:
1、OpenCV核心团队:
2、第三方机构:
如果现有的预编译版本不满足使用需求,可以下载源码自行构建编译。OpenCV使用CMake构建管理系统进行配置和构建。
安装c++编译器(compiler)和构建工具(build tool)。
*NIX平台,通常使用GCC/C++或者Clang作为编译器,使用Make或者Ninja作为构建工具。
Windows平台,可以使用Visual Studio IDE或者MinGW-w64作为编译器。
Android平台,使用Android NDK里面的Native toolchains作为编译器。
IOS、OSX平台,使用XCode IDE。
从官方网站安装CMake。
获取其他第三方依赖:例如具有视频解码功能的库,GUI显示相关的库;对选择的算法提供优化功能的库;用于生成文档和其他额外功能的工具等。查看OpenCV配置选项参考,获取可用选项和相应的依赖库。
典型的软件项目由一个或多个代码仓库组成。OpenCV有三个代码仓库:opencv- 主库,包含稳定且积极支持的算法;opencv_contrib 包含实验和非免费(专利)算法;还有一个带测试数据的仓库:opecv_extra 。
这三个仓库有两种下载方式:
1、下载仓库的快照存档,但是上面三个仓库的名称跳转既是;
2、glone仓库的完成提交历史(后面可以自由切换版本):
git clone https://github.com/opencv/opencv
git -C opencv checkout <some-tag>
# optionally
git clone https://github.com/opencv/opencv_contrib
git -C opencv_contrib checkout <same-tag-as-opencv>
# optionally
git clone https://github.com/opencv/opencv_extra
git -C opencv_extra checkout <same-tag-as-opencv>
注: 1、opencv_contrib 模块和opencv_extra 模块都是可选项,自行根据需求安装下载;
2、如果下载这俩模块,需要确保彼此兼容性。一般情况下下载对应版本号即可。
3、考虑目标平台和开发工具的版本。最新的OpenCV可能在非常老的编译器上出现构建问题。
在这一步CMake将会验证所有的工具和依赖是否可用以及兼容性问题。同时根据选择的平台生成中间文件。比如:Makefiles、IDE 工程和解决方案。通常这一步会在一个新建的build文件夹中完成。
Note: 这一步还可以使用 cmake-gui 来可视化修改编译选项。
在构建过程中,源文件被编译成目标文件,这些目标文件被链接在一起或者组合成库和相应的程序,这个步骤通过一下命令完成:cmake --build
,或者直接调用make
在安装过程中,将把生成目录中的生成结果和其他文件复制到安装位置。UNIX上默认的安装位置是 /usr/local ,Windows上默认安装位置是 C:/Program files 。这个位置可以在配置步骤中通过设置 CMAKE_INSTALL_PREFIX 选项来更改。安装命令:cmake --build
。
Note: 1、此步骤是可选的,不安装可以直接在build目录中使用;
2、若安装位置受系统保护,需要加上sudo权限: sudo cmake …
配置选项可以通过一下三种方式设置:
cmake -Doption=value ...
cmake -C my_options.txt ...
cmake-gui
OpenCV的大部分配置选项可以在顶层的cmake脚本中找到:opencv/CMakeLists.txt 。一些选项是和特定的模块对应的。
可以使用CMake工具打印所有的可用选项:
# initial configuration
cmake ../opencv
# print all options
cmake -L
# print all options with help message
cmake -LH
# print all options including advanced
cmake -LA
其中,比较重要的选项是以 WITH_, ENABLE_, BUILD_, OPENCV_ 为开头的。选项的默认值因平台和其他选项值而异。
这里的附件模块即Step1中提到的opencv_contrib仓库中的算法模块。编译选项可以指定其中的部分抑或是全部,参考OpenCV编码风格指南
example:
# build with all modules in opencv_contrib
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv
# build with one of opencv_contrib modules
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/bgsegm ../opencv
# build with two custom modules (semicolon must be escaped in bash)
cmake -DOPENCV_EXTRA_MODULES_PATH=../my_mod1\;../my_mod2 ../opencv
CMAKE_BUILD_TYPE
是一个可选项,用以指定生成的OpenCV库文件是debug版本抑或是release版本,区别在于debug会禁用许多编译器优化,也可以指定 CV_DISABLE_OPTIMIZATION
选项禁用优化功能,禁用优化的好处是方便断点调试。debug版本生成的二进制文件中包含调试符号。要在release版本中启用调试符号,需要开启BUILD_WITH_DEBUG_INFO
选项。
cmake -DCMAKE_BUILD_TYPE=Debug ../opencv
cmake --build .
BUILD_SHARED_LIBS
选择控制生成动态库 (.dll, .so, .dylib) 抑或是静态库(.a, .lib)。默认值取决于构建的目标平台,大多数情况下默认是ON(生成静态库)。
cmake -DBUILD_SHARED_LIBS=OFF ../opencv
ENABLE_PIC
设置CMAKE_POSITION_INDEPENDENT_CODE 选项。这是一个CMake的功能,启用或禁用 位置无关代码(PIC) 的生成。构建动态库或打算把静态库链接到动态库的时候,必须启用此选项。默认为ON。
OPENCV_GENERATE_PKGCONFIG
选项可以生成.pc
文件。至于什么是.pc(package configure 包/库配置文件)文件,比如gtk-2.0的pc文件内容如下:
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include
target=x11
gtk_binary_version=2.4.0
gtk_host=i386-redhat-linux-gnu
Name: GTK+
Description: GIMP Tool Kit (targettarget)Version:2.6.7Requires:gdk−{target}-2.0 atk
Libs: -Llibdir−lgtk−{target}-2.0
Cflags: -I${includedir}/gtk-2.0
可以看到.pc文件中包含了一个库的头文件、库文件所在的路径信息。GCC等编译某个工程用到这个依赖库的时候,这样用 gcc -c pkg-config –cflags gtk-2.0 sample.c
就可以方便的添加依赖信息。使用 pkg-config 的 –cflags 参数可以给出在编译时所需要的选项,而 –libs 参数可以给出连接时的选项。gcc sample.o -o sample pkg-config –libs gtk-2.0
。
但是,由于配置过程的复杂性,生成的.pc文件可能包含不完整的第三方依赖项列表,并且可能在某些配置中不起作用,尤其是构建的静态库中。此功能自OpenCV 4.x版本以后不再正式支持,默认禁用。
有两种类型的tests:准确性accuracy (opencv_test_) and 性能performance (opencv_perf_)。默认情况下启用tests和applications,examples需要手动启用。
相应的CMake选项:
cmake \
-DBUILD_TESTS=ON \
-DBUILD_PERF_TESTS=ON \
-DBUILD_EXAMPLES=ON \
-DBUILD_opencv_apps=ON \
../opencv
每一个模块都是modules目录下的一个子文件夹。每个模块都有单独的使能选项,可以禁用某个模块不参与构建:cmake -DBUILD_opencv_calib3d=OFF ../opencv
,也可以只构建指定的模块和它们的依赖项:cmake -DBUILD_LIST=calib3d,videoio,ts ../opencv
,这里我们指定了三个模块,但是配置脚本会自动确定所需要的其他依赖项。
– OpenCV modules:
– To be built: calib3d core features2d flann highgui imgcodecs imgproc ts videoio
配置脚本可以尝试从网络上下载附加的库和文件,如果失败,相应的功能会被关闭。默认情况下,所有的文件被下载到 目录,然后解压或复制到构建目录。也可以通过设置环境变量或者配置选择来更改下载缓存的位置:
export OPENCV_DOWNLOAD_PATH=/tmp/opencv-cache
cmake ../opencv
# or
cmake -DOPENCV_DOWNLOAD_PATH=/tmp/opencv-cache ../opencv
下载过程的日志会被保存在构建目录的CMakeDownloadLog.txt
中。对于下载失败文件,会在构建目录中的帮助脚本中添加一个命令,例如download_with_wget.sh
,你可以运行这些脚本,也可修改。
注:个人经验,这些第三方依赖往往难以在配置脚本中自行下载,有一个好办法,在OpenCV 官方GitHub中找到这些第三方依赖仓库(在该仓库不同的分支下,手动下拉选择即可),手动下载,并放到相应的位置,配置脚本就不会再重新下载了,此时可以正常往下执行
在x86_64的机器上,OpenCV默认会针对SSE3指令集进行编译,可以通过以下选项进行修改:
cmake -DCPU_DISPATCH=AVX,AVX2 ../opencv
Note:其他平台有自己的指令集:例如ARM上
的VFPV
和NEON
,PowerPC上的VSCX
。
一些函数支持dispathch机制,通过编译多个指令集并在运行时选择其中一个,编译多个指令集列表选项:cmake -DCPU_DISPATCH=AVX,AVX2 ../opencv
。
要禁用dispatch机制,此选项设置为空即可:cmake -DCPU_DISPATCH= ../opencv
。
可以使用以下选项禁用部分代码的优化,以便进行debug:
# disable universal intrinsics
cmake -DCV_ENABLE_INTRINSICS=OFF ../opencv
# disable all possible built-in optimizations
cmake -DCV_DISABLE_OPTIMIZATION=ON ../opencv
Note:更多关于CPU优化选项的细节,可以查看CPU优化选项
以下选项可用于生产带有检测或改进安全性的特殊构建,默认都被禁用。
选项 | 编译器 | 说明 |
---|---|---|
ENABLE_PROFILING | GCC or Clang | Enable profiling compiler and linker options |
ENABLE_COVERAGE | GCC or Clang | Enable code coverage support. |
OPENCV_ENABLE_MEMORY_SANITIZER | N/A | Enable several quirks in code to assist memory sanitizer. |
ENABLE_BUILD_HARDENING | GCC, Clang, MSVC | Enable compiler options which reduce possibility of code exploitation. |
ENABLE_LTO | GCC, Clang, MSVC | Enable Link Time Optimization (LTO) |
ENABLE_THIN_LTO | Clang | Enable thin LTO which incorporates intermediate bitcode to binaries allowing consumers optimize their applications later. |