Edited at
OpenCVDay 1

OpenCVインストール構成の変遷(OpenCV 3.4.3,3.4.4,4.0.0)


はじめに

みんなが心待ちにしていたOpenCV 4.0が先日リリースされましたね.また,ほぼ同タイミングでOpenCV 3.4.4もリリースされました.これらのバージョンでこれまでとOpenCVのインストール構成が変わっていることにたまたま気付いたので情報共有も兼ねて記事にしたいと思います.


動作確認環境

筆者は以下の環境で動作確認しました.


OS


  • Ubuntu 18.04 64bit


CMake


  • 3.10.2


コンパイラ


  • gcc 7.3.0


OpenCV


インストール構成の違い

以降はCMAKE_INSTALL_PREFIXがデフォルト(/usr/local)のままであることを前提に説明します.


OpenCV 3.4.3 vs OpenCV 3.4.4

OpenCV 3.4.3,OpenCV 3.4.4での各種インストール構成を下表にまとめます(太字の箇所が変更点).

OpenCV 3.4.3
OpenCV 3.4.4

インクルードパス

/usr/local/include/opencv
/usr/local/include/opencv2

/usr/local/include/opencv
/usr/local/include/opencv2

ライブラリパス
/usr/local/lib
/usr/local/lib

Pythonライブラリパス
/usr/local/lib/python3.6/dist-packages
/usr/local/python/cv2/python-3.6

バイナリ(アプリ)
/usr/local/bin
/usr/local/bin

OpenCV_DIR
/usr/local/share/OpenCV
/usr/local/share/OpenCV

あー,3.4.4からPythonライブラリパスが謎の場所に移動しているのでPYTHONPATHを通す必要があるわけですね(初見殺しなのでやめて).

気付かないと漏れなくこういうことになります.




OpenCV 3.4.4 vs OpenCV 4.0.0

OpenCV 3.4.4,OpenCV 4.0.0での各種インストール構成を下表にまとめます(太字の箇所が変更点).

OpenCV 3.4.4
OpenCV 4.0.0

インクルードパス

/usr/local/include/opencv
/usr/local/include/opencv2

/usr/local/include/opencv4/opencv2

ライブラリパス
/usr/local/lib
/usr/local/lib

Pythonライブラリパス
/usr/local/python/cv2/python-3.6
/usr/local/python/cv2/python-3.6

バイナリ(アプリ)
/usr/local/bin
/usr/local/bin

OpenCV_DIR
/usr/local/share/OpenCV
/usr/local/lib/cmake/opencv4/

という感想が出てもおかしくない大変歪なディレクトリ構成になっていることがわかります(OpenCV 2.xのタイミングでインクルードディレクトリをopencv2としてしまった罪は重い・・・).また,OpenCV 4.0.0からC APIが削除されたので/usr/local/include/opencvがなくなっています.

さらにOpenCV 4.0.0からOpenCV_DIRも変わっているのでCMakeでfind_package(OpenCV)としたときにちゃんと検出してくれるのか不安で眠れなくなる読者もいるかもしれません.結論から述べるとCMAKE_INSTALL_PREFIXがデフォルト(/usr/local)のままであればこんな感じで特に問題無く検出してくれます(やったね!).


-- Found OpenCV: /usr/local (found version "4.0.0")

ただし,OpenCVのビルド時にCMAKE_INSTALL_PREFIXをカスタマイズした場合,OpenCVを使ったプログラムのCMake実行時に以下のオプションを付与する必要があります(最初,OpenCVConfig.cmakeがどこに配置されているのかわからなくて混乱した・・・).

-D OpenCV_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/opencv4


おまけ(OpenCV 3系,OpenCV 4系両対応)

Transition guideにはOpenCV 2.4系,OpenCV 3系の両バージョンに対応する方法が記載されています.

OpenCV 3系はこれからもしばらく使われることが予想されるのでOpenCV 3系,OpenCV 4系両対応をこれまでと同じようにできるか不安で眠れなくなる読者もいるかもしれません.結論から述べるとこれまでと同様の対応で大丈夫です.以下にソースコード,CMakeレベルでの対応方法を示します.


ソースコード

#include <opencv2/core/version.hpp>


#if CV_MAJOR_VERSION == 3
// OpenCV 3系の処理を書く
#elif CV_MAJOR_VERSION == 4
// OpenCV 4系の処理を書く
#endif


CMake

find_package(OpenCV REQUIRED)

if(OpenCV_VERSION VERSION_LESS "4.0")
# use 3.x modules
else()
# use 4.x modules
endif()


おわりに

この記事ではOpenCV 3.4.3,3.4.4,4.0.0でのバージョン間のインストール構成の差異について紹介しました.この記事がOpenCV 4系へのスムーズな移行の助けになれば幸いです.


明日はtomoaki_teshimaさんの記事で,タイトルは「cv::waitKeyは遅いよね」となっています.とてつもなくテクい話が読めそうなのですごく楽しみです!!