OpenCV 3.4.1 on Cygwin 2.9.0 environment

>> English page
>> version 2.4.12.2

twitter ID: @cygopencv


下記の手順でビルドした 64bit Cygwin ライブラリ:
opencv-3.4.1-cygwin64-g++-6.4.0-shared-release-20180228.tar.bz2

"opencv_version.exe -v"の出力結果


1) 前準備 #1
Cygwinのsetup.exeで必要なパッケージをインストールしておきます.
通常は,最小構成でも以下のもの(+それらが依存するライブラリなど)は必要でしょう.

  "unzip"
  "cmake"
  "gcc-g++"
  "make"
  "diffutils"
  "patch"
  "libwebp-devel"
  "libIlmImf-devel"
  "libjasper-devel"
  "libjpeg-devel"
  "libpng-devel"
  "libtiff-devel"
  "libhdf5-devel"
  "libbz2-devel"
  "zlib-devel"


2) 前準備 #2 (推奨)
ffmpegをビルドします.
for example:

  $ cd /tmp/
  $ tar xvjf ffmpeg-3.4.2.tar.bz2
  $ cd ffmpeg-3.4.2/
  $ ./configure --disable-yasm \
                --disable-iconv \
                --enable-avresample \
                --prefix=/usr/local/ffmpeg-3.4.2/
  $ make -j ${NUMBER_OF_PROCESSORS} install


3-1) 前準備 #3.1 (任意:vizモジュールを使う場合)
OpenCVの"viz"モジュールはVTKが必須なので, vizモジュールをビルドしたい場合には,まずVTKのビルドが必要です. 具体的な手順はこちらの手順を参照.


3-2) 前準備 #3.2 (任意:sfmモジュールを使う場合)
OpenCVの"sfm"モジュールのreconstruction機能にはceres-solverが必須です. もしもceres-solverが無いとreconstruction機能は無効化されます. その場合でも,sfmをビルドするためにはgloggflags は必須です.
ceres-solverのビルドには,以下のCygwinパッケージが必要です.

  "eigen3"
  "libsuitesparseconfig-devel"
  "libspqr-devel"
  "libmetis-devel"
  "libcxsparse-devel"
  "libcolamd-devel"
  "libcholmod-devel"
  "libccolamd-devel"
  "libcamd-devel"
  "libamd-devel"
次に,gflagsglogceres-solverの順にビルドする.

for example:
  $ cd /tmp/
  $ tar xvzf gflags-2.2.1.tar.gz
  $ mkdir gflags_build
  $ cd gflags_build/
  $ cmake -D CMAKE_INSTALL_PREFIX:PATH=/usr/local/gflags-2.2.1/ \
          /tmp/gflags-2.2.1/
  $ make -j ${NUMBER_OF_PROCESSORS} install

  $ cd /tmp/
  $ tar xvzf glog-0.3.5.tar.gz
  $ cd glog-0.3.5/
  $ env CPPFLAGS="-D__CYGWIN64__" \
       ./configure --with-gflags=/usr/local/gflags-2.2.1/ \
                   --prefix=/usr/local/glog-0.3.5/
  $ make -j ${NUMBER_OF_PROCESSORS} install

  $ cd /tmp/
  $ tar xvzf ceres-solver-1.13.0.tar.gz
  $ mkdir ceres-solver_build
  $ cd ceres-solver_build
  $ cmake -D CXSPARSE_INCLUDE_DIR:PATH=/usr/include/suitesparse/ \
          -D GFLAGS_INCLUDE_DIR_HINTS:PATH=/usr/local/gflags-2.2.1/include/ \
          -D GFLAGS_LIBRARY_DIR_HINTS:PATH=/usr/local/gflags-2.2.1/lib/ \
          -D GLOG_INCLUDE_DIR:PATH=/usr/local/glog-0.3.5/include/ \
          -D GLOG_LIBRARY:PATH=/usr/local/glog-0.3.5/lib/libglog.a \
          -D CMAKE_INSTALL_PREFIX:PATH=/usr/local/ceres-solver-1.13.0/ \
          /tmp/ceres-solver-1.13.0/
  $ make -j ${NUMBER_OF_PROCESSORS} install


3-3) 前準備 #3.3 (任意:textモジュールを使う場合)
OpenCVの"text"モジュールはTesseract-OCRへのインタフェースを持っています. Tesseract-OCRの入手は,Cygwinパッケージの以下のものをインストールすれば良いです.

  "tesseract-ocr-devel"


3-4) 前準備 #3.4 (任意:freetypeモジュールを使う場合)
OpenCVの"freetype"モジュールはfreetypeライブラリとHarfBuzzに依存しています.
freetypeの入手は,Cygwinパッケージの以下のものをインストールすれば良いです.

  "libfreetype-devel"
次に,HarfBuzzは自前でビルドする必要があります.コードはこちらからアーカイブを入手できます.(githubのコードを使わないことに注意.githubにはビルドに必要な設定ファイルが含まれていません.) なおHarBuzz自体はcmakeでもビルド可能ですが,cmakeを使っても*.cmakeファイルが提供されないので,configureを使います(その場合は*.pcファイルがインストールされる).
for example:
  $ cd /tmp/
  $ tar xvzf harfbuzz-1.7.5.tar.bz2
  $ cd harfbuzz-1.7.5/
  $ ./configure --enable-static \
                --disable-shared \
                --prefix=/usr/local/harfbuzz-1.7.5/
  $ make -j ${NUMBER_OF_PROCESSORS} install


4) パッチ適用
opencv-3.4.1.tar.gzおよびopencv_contrib-3.4.1.tar.gzを入手し,私のCygwin用パッチopencv-3.4.1-cygwin-patch-20180228.txt.gzopencv_contrib-3.4.1-cygwin-patch-20180228.txt.gzを適用します.

for example:

  $ cd /tmp/
  $ tar xvzf opencv-3.4.1.tar.gz
  $ gunzip opencv-3.4.1-cygwin-patch-20180228.txt.gz
  $ cd opencv-3.4.1/
  $ patch -p1 < ../opencv-3.4.1-cygwin-patch-20180228.txt

  $ cd /tmp/
  $ tar xvzf opencv_contrib-3.4.1.tar.gz
  $ gunzip opencv_contrib-3.4.1-cygwin-patch-20180228.txt.gz
  $ cd opencv_contrib-3.4.1/
  $ patch -p1 < ../opencv_contrib-3.4.1-cygwin-patch-20180228.txt


5) ビルド,インストール
OpenCVのビルドには,cmakeでENABLE_CXX11とHAVE_CXX11をdisableして,g++のコンパイラオプションに"-std=gnu++14"を設定する必要があります. さらに,WITH_ITTもdisableする必要があります.(私がITT付きのビルドを試した範囲では,OpenCVのcoreモジュールのリンク時のエラーが解決できませんでした.) また,私が試した際はCPU_DISPATCHを設定する必要がありました(AVX512_SKXのコードがエラーになったので).
for example:

  $ mkdir build_shared_release/
  $ cd build_shared_release/
  $ env PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:/usr/local/ffmpeg-3.4.2/lib/pkgconfig/:/usr/local/harfbuzz-1.7.5/lib/pkgconfig/" \
    cmake -D CMAKE_BUILD_TYPE:STRING=RELEASE \
          -D BUILD_SHARED_LIBS:BOOL=ON \
          -D ENABLE_CXX11:BOOL=OFF \
          -D HAVE_CXX11:BOOL=OFF \
          -D CMAKE_CXX_FLAGS:STRING="-std=gnu++14 -Wa,-mbig-obj" \
          -D CMAKE_C_FLAGS:STRING="-Wa,-mbig-obj" \
          -D CPU_DISPATCH:STRING="SSE4_1;SSE4_2;AVX;FP16;AVX2;" \
          -D WITH_ITT:BOOL=OFF \
          -D WITH_IPP:BOOL=OFF \
          -D WITH_OPENMP:BOOL=ON \
          -D WITH_OPENGL:BOOL=ON \
          -D ENABLE_FAST_MATH:BOOL=ON \
          -D BUILD_PERF_TESTS:BOOL=OFF \
          -D BUILD_TESTS:BOOL=OFF \
          -D BUILD_EXAMPLES:BOOL=OFF \
          -D VTK_DIR:PATH=/usr/local/vtk-8.1.0/lib/cmake/vtk-8.1/ \
          -D GLOG_INCLUDE_DIR:PATH=/usr/local/glog-0.3.5/include/ \
          -D Glog_LIBS:PATH=/usr/local/glog-0.3.5/lib/libglog.a \
          -D GFLAGS_INCLUDE_DIRS:PATH=/usr/local/gflags-2.2.1/include/ \
          -D GFLAGS_LIBRARIES:PATH=/usr/local/gflags-2.2.1/lib/libgflags.a\
          -D Ceres_DIR:PATH=/usr/local/ceres-solver-1.13.0/lib/cmake/Ceres/ \
          -D CMAKE_INSTALL_PREFIX:PATH=/usr/local/opencv-3.4.1/ \
          -D OPENCV_EXTRA_MODULES_PATH:PATH=/tmp/opencv/opencv_contrib-3.4.1/modules/ \
          -D OPENCV_ENABLE_NONFREE:BOOL=ON \
          /tmp/opencv-3.4.1/
  $ make -j ${NUMBER_OF_PROCESSORS} install