从源代码编译OTB¶
本节介绍如何使用以下工具从源代码编译OTB CMake 。如果您只需要安装OTB,请按照 安装 一节。
众所周知,OTB从事以下方面的工作:
- Windows 10上的Visual Studio 2019
- GCC 5或更高版本,在GNU/LINUX上Clang 3.4或更高版本
- MacOS 10.8或更高版本上的AppleClang(英特尔,没有像M1那样的ARM)
从版本6.2.0开始需要C++14标准。
OTB依赖于许多外部库。有些是强制的,这意味着没有它们就无法编译OTB,而其他(大多数)是可选的,可以在构建过程中激活或不激活:
Library | Mandatory | Minimum version | Superbuild Version |
Boost | 是 | 1.72.0 | |
Expat | 是 | 2.4.8 | |
FreeType | 是 | 2.6.0 | |
Geos | 是 | 3.9.3/3.6.5(Windows) | |
ITK | 是 | 4.6.0 | 4.13.3 |
GDAL | 是 | 2.4.1 | 3.4.2/3.2.2(Windows) |
HDF4 | 是 | 4.2.13 | |
HDF5 | 是 | 1.10.1 | |
libgeotiff | 是 | 1.7.1 | |
libjpeg-turbo | 是 | 1.5.3 | |
libpng | 是 | 1.6.37 | |
libtiff | 是 | 4.4.0 | |
NetCDF | 是 | 4.7.4 | |
Noto Fonts | 是 | ||
OpenJPEG | 是 | 2.3.1 | |
PROJ | 是 | 8.2.0/6.2.1(Windows) | |
SQLITE | 是 | 3.36.0/3.8.8(Windows) | |
tinyXML | 是 | 2.6.2 | |
ZLIB | 是 | 1.2.12 | |
6S | 不是 | ||
Curl | 不是 | 7.54.1 | |
FFTW | 不是 | 3.3.10 | |
libKML | 不是 | 1.2 | 1.3.0 |
libSVM | 不是 | 2.0 | 3.25 |
MPI | 不是 | ||
MuParser | 不是 | 2.3.2 | |
MuParserX | 不是 | 4.0.7 | 4.0.8 |
OpenCV | 不是 | 3.0.0 | 4.6.0 |
Shark | 不是 | 4 | 4.0 |
SiftFast | 不是 | ||
SPTW | 不是 | ||
SWIG | 不是 | 4.0.2 |
GNU/Linux和MacOS¶
设置构建环境¶
注:在某些发行版中,默认情况下不支持GCC 5+。例如,在CentOS 7中,默认版本是4.8(GCC 7可以使用DevTool集安装,请参阅 devtoolset6 和 devtoolset7) 。
首先要做的是创建一个使用OTB的目录。本指南将使用 ~/OTB
但你可以自由选择其他东西。在此目录中,将有三个位置:
~/OTB/otb
对于源Git存储库~/OTB/build
对于中间构建对象,生成特定的文件、库和二进制文件。~/OTB/install
,构建后的OTB安装目录。系统位置 (/usr/local
例如)也可以使用,但本地安装更灵活,不需要超级用户访问权限。
$ mkdir ~/OTB
$ cd ~/OTB
$ git clone https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb.git
$ mkdir build
$ mkdir install
OTB项目使用Git分支模型,其中 develop
是当前的开发版本。它包含最新的补丁程序,并代表下一版本正在进行的工作。 master
是最新的稳定版本。
检查您现在想要建立的分支机构:
$ cd ~/OTB/otb
$ git checkout develop
现在,有两种从源代码编译OTB的方法,具体取决于您希望如何管理依赖项。这两种方法都依赖于CMake。
- SuperBuild :所有OTB依赖项都会自动下载和编译。这种方法是最容易使用的,并且以最小的工作量提供了完整的OTB。
- Normal build :OTB依赖项必须已编译并在您的系统上可用。这种方法需要更多的工作,但提供了更多的灵活性。
如果您不知道使用哪种方法,只想编译OTB及其所有模块,请使用SuperBuild。
重要信息:CMake配置变量:
CMAKE_INSTALL_PREFIX
: Installation directory, target formake install
BUILD_EXAMPLES
:激活OTB示例的编译BUILD_TESTING
:激活测试编译OTB_BUILD_DEFAULT_MODULES
:激活构建示例所需的所有常用模块OTB_USE_XXX
:激活模块 XXXOTBGroup_XXX
:启用组中的模块 XXXOTB_DATA_ROOT
:OTB-数据存储库OTB_WRAP_PYTHON
:启用Python包装器
仅限SuperBuild:
DOWNLOAD_LOCATION
:下载依赖项的位置USE_SYSTEM_XXX
:使用系统的 XXX 类库
SuperBuild:构建OTB和所有依赖项¶
OTB的编译通过指定配置变量进行定制。最重要的配置变量如上表所示。提供配置变量的最简单方法是通过命令行 -D
选项:
$ cd ~/OTB/build
$ cmake -D CMAKE_INSTALL_PREFIX=~/OTB/install ../otb/SuperBuild
您还可以使用以下命令手动设置变量 cmake-gui
或 ccmake
。
请注意, CMAKE_INSTALL_PREFIX
变量非常重要,因为SuperBuild将在编译步骤中安装一些目标。因此,即使您不使用Make Install Target,也将使用此目录。事实上,没有 make install 超级建筑的目标。另请注意,如果未指定cmake,则将使用默认安装目录,该目录位于 ../superbuild_install
。
默认情况下,SuperBuild不会使用系统上安装的任何库。全 USE_SYSTEM_XXX
设置为 OFF 。这是我们推荐的使用SuperBuild的方式。但是,如果您愿意,您可以自由使用系统库!您必须非常清楚您从系统中使用的那些库的依赖关系。例如,如果在SuperBuild中没有使用libjpeg,那么就不应该在SuperBuild中使用zlib,因为zlib是libjpeg的依赖项。此处SuperBuild将不会设置 USE_SYSTEM_ZLIB=FALSE
。用户必须使用以下命令重新运行cmake -DUSE_SYSTEM_ZLIB=FALSE
。上面的libjpeg-zlib依赖示例非常简单。想象一下GDAL依赖于zlib、libjpeg、libtiff(具有很大的tiff支持)、Geotiff、Sqlite、curl、geos、libkml、Openjpeg的情况。这是我们建议只使用SuperBuild的原因之一。
所有依赖项的配置和构建方式都有助于我们获得高效的OTB构建。因此,我们在GDAL版本中启用了Geotiff(支持proj4)、Openjpeg、geos。
SuperBuild将依赖项下载到 DOWNLOAD_LOCATION
目录,该目录将是 ~/OTB/build/Downloads
在我们的示例中。可以在编译步骤之前将依赖项手动下载到此目录中。如果您希望绕过代理、打算在没有Internet连接的情况下编译OTB或其他网络限制,这会很有用。您可以找到一个存档,其中包含我们所有依赖项的源代码 the Orfeo ToolBox website (选择与您想要构建的OTB版本相对应的‘SuperBuild-存档’)。
Notes about GDAL: 从OTB 7.0开始,SuperBuild的GDAL版本为2.4.1。此版本需要pkg-config才能正确查找OpenJPEG(需要以.jp2、.j2k格式读取和写入图像),GDAL 2.4.1的最低版本为0.21。您可以使用以下命令进行安装:
apt-get install pkg-config
您现在已经准备好编译OTB了!只需使用make命令(可以使用CMake生成其他目标 -G
选项):
$ cd ~/OTB/build
$ make
应用程序将位于 CMAKE_INSTALL_PREFIX/bin/
目录:
~/OTB/install/bin/otbcli_ExtractROI
将启动命令行版本的 ExtractROI 应用程序,而:
为了确保从系统中的任何位置访问您的OTB版本,我们建议设置以下环境变量。首先,添加 bin/
目录到您的路径,以便于访问:
export PATH=$PATH:~/OTB/install/bin
第二,添加 lib/
目录到您的 LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=~/OTB/install/lib:$LD_LIBRARY_PATH
正常构建:仅构建OTB¶
一旦系统上的所有OTB依赖项都可用,就可以使用CMake生成一个生成文件:
$ cd ~/OTB/build
$ cmake -C configuration.cmake ../otb
剧本 configuration.cmake
如果CMake无法自动找到依赖项位置,则需要包含依赖项位置。这可以使用 XXX_DIR
变量,这些变量包含包含FindXXX.cmake脚本的目录,或者 XXX_INCLUDEDIR
和 XXX_LIBRARY
变量。
此外,确定您希望启用哪个模块,以及测试和示例。有关CMake变量的列表,请参阅上表。
OTB是模块化的。可以只构建一些模块,而不是构建整个集合。要停用模块(以及依赖它的模块),请关闭CMake变量 OTB_BUILD_DEFAULT_MODULES
、配置,然后分别关闭 Module_module_name
变量。
一些OTB功能被认为是可选的,您可以停用相关模块,这要归功于一组以 OTB_USE_XXX
。下表显示了哪些模块与这些变量相关联。请注意,这些变量覆盖变量,这一点非常重要 OTB_BUILD_DEFAULT_MODULES
。
您现在已经准备好编译OTB了!只需使用make命令(可以使用CMake生成其他目标 -G
选项):
$ make
安装目标将二进制文件和库复制到安装位置:
$ make install
CMake variable | 3rd party module | Modules depending on it |
OTB_USE_LIBKML | OTBlibkml | OTBKMZ编写器OTBIOKML OTBAppKMZ |
OTB_USE_CURL | OTBCurl | |
OTB_USE_MUPARSER | OTBMuParser | OTBMathParser OTBDempsterShafer OTB应用分类OTBAppMathParser OTBAppStereo OTBAppProjection OTB应用分割OTB道路提取OTBRCC8 OTBCCOBIA OTBMeanShift |
OTB_USE_MUPARSERX | OTBMuParserX | OTBMathParserX OTBAppMathParserX |
OTB_USE_LIBSVM | OTBLibSVM | 对于OTB可选监督OTB应用程序分类 |
OTB_USE_OPENCV | OTBOpenCV | 对于OTB可选监督OTB应用程序分类 |
OTB_USE_SHARK | OTBShark | 对于OTB可选监督OTB应用程序分类 |
OTB_USE_6S | OTB6S | OTB光学校准OTB应用光学校准OTB模拟 |
OTB_USE_SIFTFAST | OTBSiftFast |
表:第三方和相关模块。
窗口¶
在Windows上开发OTB所需的所有内容,包括从源代码进行编译,都在OTB维基上进行了详细介绍,网址为:
http://wiki.orfeo-toolbox.org/index.php/OTB_development_on_Windows
已知问题¶
请核对一下 our gitlab tracker 以获取开放错误的列表。
测试¶
OTB有2500多项测试。运行它们可能需要20分钟到3小时,这取决于编译选项(发布模式确实会有所不同)和硬件。
要运行测试,请首先确保设置选项 BUILD_TESTING
至 ON
在建造类库之前。如果您想要运行对pythonAPI的测试,则还需要安装python模块 pytest 。
对于某些测试,您还需要测试数据和基线(~1 GB)。这些文件使用以下方式存储 git-lfs in the Data folder at the root of otb sources. To download them, you have to make sure git-lfs is installed before cloning otb (binaries for git lfs are available for different OS here )。
下载后,将二进制文件添加到$PATH并运行 git lfs install 。然后,您可以克隆OTB源:
git clone https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb.git
使用测试构建OTB后,您只需转到构建OTB的二进制目录并运行 ctest -N
有一份所有测试的清单。只是在用 ctest
将运行所有测试。要选择子集,您可以执行以下操作 ctest -R Kml
运行与KML文件相关的所有测试,或者 ctest -I 1,10
运行从1到10的测试。
编写文档¶
要构建操作手机,需要以下Python包: numpy, sphinx, sphinx_rtd_theme
。它们可在PIP上获得:
pip install numpy sphinx sphinx_rtd_theme
启用Python绑定并设置 BUILD_COOKBOOK
:
cmake -DOTB_WRAP_PYTHON=ON -DBUILD_COOKBOOK=ON .
然后,构建目标:
make CookbookHTML