OpenCV Build - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) Build

ソースからのビルド(macOSとLinux(Ubuntu))

共通事項

ディレクトリ構成

適当なディレクトリで作業する(ここでは$HOME/sandboxで作業)。

  1. git cloneでopencvとopencv_contribを持ってくる
  2. opencv/buildを掘る
  3. opencv_contribとの位置関係が重要
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
mkdir opencv/build
cd opencv/build

のような感じ。あとはcmakeを実行する。

ccmake ..

として、OPENCV_ENABLE_NONFREEをONにしたり、OPENCV_EXTRA_MODULES_PATHを../../opencv_contrib/modulesにする。

あるいはcmakeに-Dで設定を指定する。

cmake -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..

Python module

※基本的にAnaconda, Homebrew, apt等のパッケージを使うのがオススメだが、OpenCV-謎エラーを回避したり、最新版を使いたい時はビルドが必要。

過去に色々書いたがPython moduleについてはややこしいので再整理。

  1. cv2が参照するライブラリ(libopencv_*)はビルド時に生成・参照したもの(or 同条件で生成・参照したもの)でないと動かない
  2. 初めてのcmakeでPython環境がスキャンされるので、その時にPYTHON_EXECUTABLEで使いたい環境を指定する(素直な環境ではPYTHON2_*やPYTHON3_*は不要)
  3. 上手くいかないときはCMakeCache.txtファイルを削除してcmake(ccmakeではない)
  4. CMAKE_BUILD_TYPEはRELEASEで

特に1の条件が面倒でpyenv, Anacondaを使っていて、システムに存在するライブラリ群とは別のライブラリを保有している場合(Qtなど)は、そっちを参照させないとエラーになる。

  • /usrや/usr/localに入っているpython→/usrや/usr/localに存在するライブラリ。インストール先も/usr/local等システムで参照できる状態
  • pyenvやAnacondaのpython→ $HOME/.pyenvや $HOME/Anaconda3or2の中に存在するライブラリ。インストール先も同様に各環境に入れる。

当然参照しているライブラリをアップデートした場合はcv2モジュールもビルドし直しになる。

pyenvやAnacondaでのメリットはC++ I/FのOpenCVをHomebrewやaptで入れても干渉しないところ。

Ubuntuでのaptや、macOSでHomebrewから入れたPython3を使う場合

cmake -D CMAKE_BUILD_TYPE=RELEASE -D PYTHON_EXECUTABLE=$(which python3) ..

で、

-- Found PythonInterp: /usr/local/bin/python3 (found suitable version "3.6.2", minimum required is "2.7")
-- Found PythonInterp: /usr/local/bin/python3 (found suitable version "3.6.2", minimum required is "3.4")
-- Found PythonLibs: /usr/local/Frameworks/Python.framework/Versions/3.6/lib/libpython3.6m.dylib (found suitable exact version "3.6.2")

のような表示が出れば成功(上記はmacOSの場合)。その後で

ccmake ..

とすればCMakeCache.txtが生きてるのでBUILD_opencv_python3が現われ、そのまま設定できる。

Homebrewのpython2

求められるバージョンがシビアなのでpython2を--HEADで入れないと多分無理(試していない)

pyenvやAnacondaのpython3

特にpyenvの場合、直接のバイナリが隠蔽されていてcmakeの結果もグチャグチャになるので明示するのが吉。

pyenvでAnaconda3-4.2.0を入れてる場合を例にする(python3についてはバージョンなりを変えれば他でも問題ない)。QtはAnacondaの各々の中に入っているのを使うのが安全(バージョン問題が生じなければ取り敢えずは動く)。ということで、CMAKE_INSTALL_PREFIXもpyenv内の環境を指定する。

Anaconda3の場合

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$HOME/anaconda/ \
-D PYTHON_EXECUTABLE=$HOME/anaconda/bin/python3 \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=$HOME/sandbox/opencv_contrib/modules \
-D OPENCV_ENABLE_NONFREE=ON \
-D QT_QMAKE_EXECUTABLE=$HOME/anaconda/bin/qmake \
-D Qt5Core_DIR=$HOME/anaconda/lib/cmake/Qt5Core \
-D Qt5Concurrent_DIR=$HOME/anaconda//lib/cmake/Qt5Concurrent \
-D Qt5Gui_DIR=$HOME/anaconda/lib/cmake/Qt5Gui \
-D Qt5Test_DIR=$HOME/anaconda/lib/cmake/Qt5Test \
-D Qt5Widgets_DIR=$HOME/anaconda/lib/cmake/Qt5Widgets \
-D Qt5OpenGL_DIR=$HOME/anaconda/lib/cmake/Qt5OpenGL ..
make -j4
make install

Anacondaの仮想環境の場合

上のanacondaをanaconda/envs/envnameに置き換えれば良い。 但し、CMakeCache.txtを削除しておかないと、Python Interpreterが更新されないので注意。 例えば、

rm CMakeCache.txt
conda create -n ocv numpy scipy jupyter ipython matplotlib
source activate ocv

のように環境ocvを作った場合

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$HOME/anaconda/envs/ocv/ \
-D PYTHON_EXECUTABLE=$HOME/anaconda/envs/ocv/bin/python3 \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=$HOME/sandbox/opencv_contrib/modules \
-D OPENCV_ENABLE_NONFREE=ON \
-D QT_QMAKE_EXECUTABLE=$HOME/anaconda/envs/ocv/bin/qmake \
-D Qt5Core_DIR=$HOME/anaconda/envs/ocv/lib/cmake/Qt5Core \
-D Qt5Concurrent_DIR=$HOME/anaconda/envs/ocv//lib/cmake/Qt5Concurrent \
-D Qt5Gui_DIR=$HOME/anaconda/envs/ocv/lib/cmake/Qt5Gui \
-D Qt5Test_DIR=$HOME/anaconda/envs/ocv/lib/cmake/Qt5Test \
-D Qt5Widgets_DIR=$HOME/anaconda/envs/ocv/lib/cmake/Qt5Widgets \
-D Qt5OpenGL_DIR=$HOME/anaconda/envs/ocv/lib/cmake/Qt5OpenGL ..

とする。

pyenv + Anaconda3の場合

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$HOME/.pyenv/versions/anaconda3-4.2.0 \
-D PYTHON_EXECUTABLE=$HOME/.pyenv/versions/anaconda3-4.2.0/bin/python3 \
-D PYTHON3_EXECUTABLE=$HOME/.pyenv/versions/anaconda3-4.2.0/bin/python3 \
-D PYTHON3_INCLUDE_DIR=$HOME/.pyenv/versions/anaconda3-4.2.0/include/python3.5m/ \
-D PYTHON3_LIBRARY=$HOME/.pyenv/versions/anaconda3-4.2.0/lib/libpython3.5m.dylib \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=$HOME/sandbox/opencv_contrib/modules \
-D OPENCV_ENABLE_NONFREE=ON \
-D QT_QMAKE_EXECUTABLE=$HOME/.pyenv/versions/anaconda3-4.2.0/bin/qmake \
-D Qt5Core_DIR=$HOME/.pyenv/versions/anaconda3-4.2.0/lib/cmake/Qt5Core \
-D Qt5Concurrent_DIR=$HOME/.pyenv/versions/anaconda3-4.2.0//lib/cmake/Qt5Concurrent \
-D Qt5Gui_DIR=$HOME/.pyenv/versions/anaconda3-4.2.0/lib/cmake/Qt5Gui \
-D Qt5Test_DIR=$HOME/.pyenv/versions/anaconda3-4.2.0/lib/cmake/Qt5Test \
-D Qt5Widgets_DIR=$HOME/.pyenv/versions/anaconda3-4.2.0/lib/cmake/Qt5Widgets \
-D Qt5OpenGL_DIR=$HOME/.pyenv/versions/anaconda3-4.2.0/lib/cmake/Qt5OpenGL ..
make -j4
make install