ま、そんなところで。

ニッチな技術系メモとか、車輪を再発明してみたりとか.

pyenv環境へOpenCVをインストールする

pyenvで作ったpython環境へ最新のOpenCVをビルドしてインストールする手順のメモです.

0. 前提環境

  • Ubuntu 18.04
  • 開発用パッケージ(build-essential, cmake)インストール済み.

1. ソースコードのダウンロード

まず下記からOpenCVソースコードをDLする.
https://opencv.org/releases.html

続いて、OpenCVのContribのソースコードをダウンロードする.
ここでは、OpenCV本体のバージョンに対応すたバージョンをダウンロードするように注意. https://github.com/opencv/opencv_contrib/releases

ダウンロードしたら、適当なディレクトリに以下のように展開しておく.

.
├── build/   # ビルド作業ディレクトリ
├── opencv-3.4.1/            # OpenCVのソース
└── opencv_contrib-3.4.1/    # OpenCV-contribのソース

2. numpyをインストールする

pythonOpenCVモジュールのビルドの際にnumpyモジュールのヘッダが必要になるので、pipでnumpyをインストールしておく.
pyenvの環境へnumpyをインストールすると、依存ライブラリ開発用のC言語用ヘッダファイルもインストールされる.

numpyのインストール

# python環境を切り替える
$ pyenv global [インストールしたいpython環境]
# pipでnumpyをインストール
$ pip install numpy

pipでpython環境へnumpyがインストールされると、一緒にC言語用のヘッダファイルもデプロイされている.

numpyのインストール先

# python 3.6.5の場合.
# pyenvのディレクトリがHOME直下にある場合は下記場所にインストールされるはず.
${HOME}/.pyenv/versions/3.6.5/lib/python3.6/site-packages/numpy/

3. OpenCVモジュールのビルドとインストール

ビルド作業ディレクトリ(build)に移動し、cmakeを実行する.
cmakeではpyenvにOpenCVのライブラリがデプロイされるように、インストール先などをcmakeのプロパティを使って指定する.
ここではOpenCVライブラリのインストール先をpython環境下の usr/local とした.

pyenv環境は ${HOME}/.pyenv 、インストール先のpythonバージョンとして3.6.5を想定した場合、以下のようなコマンドになる.
とにかく設定パラメータが多いので注意.

buildディレクトリでcmakeを実行

# buildへ移動
$ cd build
# cmakeでMakefile生成
$ cmake ${PWD}/../opencv-3.4.1 \     # <--- buildディレクトリからopencvのディレクトリを参照してます
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=${HOME}/.pyenv/versions/3.6.5/usr/local/ \    # <--- make install先ディレクトリ
-DINSTALL_C_EXAMPLES=OFF \
-DBUILD_NEW_PYTHON_SUPPORT=ON \
-DBUILD_opencv_python3=ON \
-DBUILD_opencv_legacy=OFF \
-DINSTALL_PYTHON_EXAMPLES=ON \
-DBUILD_EXAMPLES=ON \
-DPYTHON_EXECUTABLE=${HOME}/.pyenv/versions/3.6.5/bin/python \
-DPYTHON_LIBRARY=${HOME}/.pyenv/versions/3.6.5/lib/libpython3.6m.a \
-DPYTHON_INCLUDE_DIR=${HOME}/.pyenv/versions/3.6.5/include/python3.6m \
-DPYTHON_INCLUDE_DIRS=${HOME}/.pyenv/versions/3.6.5/include/python3.6m \
-DPYTHON_INCLUDE_DIRS2=${HOME}/.pyenv/versions/3.6.5/include/python3.6m \
-DINCLUDE_DIRS=${HOME}/.pyenv/versions/3.6.5/include/python3.6m \
-DINCLUDE_DIRS2=${HOME}/.pyenv/versions/3.6.5/include/python3.6m \
-DPYTHON_PACKAGES_PATH=${HOME}/.pyenv/versions/3.6.5/lib/python3.6/site-packages \
-DPYTHON_NUMPY_INCLUDE_DIR=${HOME}/.pyenv/versions/3.6.5/lib/python3.6/site-packages/numpy/core/include \
-DOPENCV_EXTRA_MODULES_PATH=${PWD}/../opencv_contrib-3.4.1/modules

cmakeが無事完了したら、カレントディレクトリにMakefileが生成されているはずなので、makeを実行.
時間がかかるので並列ビルドをするとよいです.

Makeの実行

# 8スレッドで並列ビルド&インストール
$ make -j8 install

ビルドとインストールが完了したら、
${HOME}/.pyenv/versions/3.6.5/usr/local/
に、ビルドされたOpenCVライブラリ一式がインストールされていることを確認.

こんな感じのツリーが作られていればOK.

.
├── bin
│     ├── opencv_annotation
│     ├── opencv_createsamples
│     ├── opencv_interactive-calibration
│     ├── opencv_traincascade
│     ├── opencv_version
│     ├── opencv_visualisation
│     └── opencv_waldboost_detector
│
├── include
│     ├── opencv
│     └── opencv2
│
├── lib
│     ├── libopencv_aruco.so -> libopencv_aruco.so.3.4
│     ├── libopencv_aruco.so.3.4 -> libopencv_aruco.so.3.4.1
│     ├── libopencv_aruco.so.3.4.1
│     ├── libopencv_bgsegm.so -> libopencv_bgsegm.so.3.4
│     ├── libopencv_bgsegm.so.3.4 -> libopencv_bgsegm.so.3.4.1
│     ├── libopencv_bgsegm.so.3.4.1
│     ├── libopencv_bioinspired.so -> libopencv_bioinspired.so.3.4
│     ├── libopencv_bioinspired.so.3.4 -> libopencv_bioinspired.so.3.4.1
│     ├── libopencv_bioinspired.so.3.4.1
:     :
:     :  (途中省略)
:     :
│     ├── pkgconfig
│     └── python3.6
│             └── site-packages
│                     └── cv2.cpython-36m-xxxxx-xxxxxxx.so   # python連携用ライブラリ
└── share
        └── OpenCV

4. python環境からOpenCVが使えるようにする

ファイルが無事インストールされたら、pythonコードからOpenCVライブラリが認識されるように、
インストール先python環境の site-packages に cv2.cpython-36m-xxxxx-xxxxxxx.so ライブラリへのシンボリックリンクを配置します.

site-packagesにpython連携ライブラリのリンクを配置

# 配置先ディレクトリ
$ cd ${HOME}/.pyenv/versions/3.6.5/lib/python3.6/site-packages
# cv2という名前でライブラリ参照できるように.
$ ln -s ${HOME}/.pyenv/versions/3.6.5/usr/local/lib/python3.6/site-packages/cv2.cpython-36m-xxxxx-xxxxxxx.so  cv2.so

5. ロードされることを確認

interactiveモードでopencv2のライブラリがロードされることを確認します.

$ python3
>>> import cv2
>>> cv2.__version__
'3.4.1'

無事ロードできました!


参考サイト

Install opencv3 for python 3.5.0 with pyenv on ubuntu 14.04 · GitHub