はじめに
- この記事はOpenCV Advent Calendar 2018の1日目の記事です.
- 他の記事は目次にまとめられています.
みんなが心待ちにしていた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
を通す必要があるわけですね(初見殺しなのでやめて).
気付かないと漏れなくこういうことになります.
python bindingでimport cv2が失敗するな?🤔と思ったら/usr/local/python/cv2/python-3.5/にcv2.cpython-35m-x86_64-linux-gnu.soが配置されている(けどパスを通していない)せいだった・・・
— dandelion (@dandelion1124) 2018年11月18日
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/ |
インストール後のヘッダファイルがあるディレクトリが/usr/local/include/opencv4/opencv2/という「おまえは何を言っているんだ」という感じになっているのは一体・・・
— dandelion (@dandelion1124) 2018年11月18日
という感想が出てもおかしくない大変歪なディレクトリ構成になっていることがわかります(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は遅いよね」となっています.とてつもなくテクい話が読めそうなのですごく楽しみです!!