yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

OpenCV3.1の導入withCMake

以前OpenCV 2.4.9導入-with CMake という記事を書きましたが、それからバージョンアップが続き、ついに3.1がリリースされました。

またコンパイラVisual Studio 2015がUpdate1でようやく安定して使い物になるようになりました。

というわけで改めてまとめようかと思います。あ、pythonとか使ったこと無いのでいい加減知識です、当てにしないように。

Visual Studio Update1は入っている前提で話をすすめます。まだの人は
Clang with Microsoft CodeGenがでたので試す - Qiita
C++を始めよう for windows - Qiita
あたりみてがんばってください。

OpenCVとは

ざっというと画像処理に関するプログラミングを超強力にアシストしてくれるライブラリーです。詳細は
http://www.buildinsider.net/small/opencv/01
に譲ります。

目標

  • CMakeを使ってWin32、x64両対応できるように導入する
  • pythonでも使えるようにする
  • TBB, Eigenをなんとなく有効にする

環境

項目 内容
OpenCVバージョン OpenCV 3.1
Visual Studio Visual Studio 2015 Community Update1
ビルド構成 Win32 or x64 | Debug or Release
OS Windows 7 Homr Premium(64bit)

(任意)pythonの導入

pythonは32bit版と64bit版がありますが、64bit版は罠です。32bit版を使いましょう

64bit版にはnumpyとか無いんです。非公式版はあるけど私の環境では動かなかったし。

  1. https://www.python.org/downloads/
    にアクセスし、
    Windows x86 MSI installerWindows debug information files
    の2つを落とす。今回はpython3.4.4にした。もう一度言うけどx86(32bit)を選ぶんやぞ!たとえマシンが64bit、OSが64bitだとしても!
  2. python-[version番号].msiをダブルクリックして実行する。
    Add python.exe to Path
    は有効にしたほうがいいと思う。パスは空白パスとか日本語パス避ければどこでもいいと思うけど自分はデフォルトパスにした。
  3. 適当にこの辺を管理者権限コマンドプロンプトで実行する。必要かどうかは知らない。
    pip install pip --upgrade
    pip install python-dateutil
    pip install pyparsing
    pip install wheel
  4. http://sourceforge.net/projects/numpy/files/NumPy/
    にアクセスし、最新版(今回は1.10.2)をクリック、numpy-[numpyのversion番号]-win32-superpack-python[pythonのversion番号].exeを落とす。
    今回はnumpy-1.10.2-win32-superpack-python3.4.exeを落とした。 そのままの勢いでexeを実行する。なぜpipで入れないかというとどうせ失敗するから。
  5. (任意)http://sourceforge.net/projects/scipy/files/scipy/
    にアクセスし、最新版(今回は0.16.1)をクリック、scipy-[scipyのversion番号]-win32-superpack-python[pythonのversion番号].exeを落とす。
    今回はscipy-0.16.1-win32-superpack-python3.4.exeを落とした。 そのままの勢いでexeを実行する。なぜpipで入れないかというと(ry
  6. (任意)http://sourceforge.net/projects/matplotlib/files/matplotlib/
    にアクセスし、最新版(今回は1.5.0)をクリック、さらにWindowsをクリックして、matplotlib-[matplotlibのversion番号]-cp34-none-win32.whlを落とす。
    今回はmatplotlib-1.5.0-cp34-none-win32.whlを落とした。
  7. (任意)管理者権限コマンドプロンプトで以下のように実行する。
    cd [落とした場所]
    pip install matplotlib-[matplotlibのversion番号]-cp34-none-win32.whl
  8. 最初に落としたpython-[version番号]-pdb.zipを解凍し、python.exeがあるフォルダに新たに「symbols」とかフォルダ作ってそこに中身を全部入れる

pythion3 Debug Buildについて

なおここまでやって作れるのは32bitのRelease buildだけです。Debugビルドは

fatal error LNK1104: cannot open file 'python34_d.lib'

と怒られます。かと言って自力でpythonをビルドするのは至難の業でして、諦めるが吉でしょう。
頑張りたい人は
http://p-nand-q.com/python/building-python-27-with-visual_studio.html
http://stackoverflow.com/questions/17028576/using-python-3-3-in-c-python33-d-lib-not-found
を参考に。私はやりたくない。

CUDA

CUDAを使うにはCUDA Toolkit 7.5を落とすわけですが、これについてくるNsight Visual Studio Edition、Visual Studio 2015に対応してないんですよね・・・。はよう8.0こい。

doxygen

doxygenといえばJavaでいうJavaDocに相当し、ドキュメント生成で有名なツールですね。OpenCVのdocumentはオンラインでも読めますが、オフラインで読めたほうがいいので導入しましょう

  1. http://www.doxygen.jp/
    にアクセスする
  2. ダウンロードを押す
  3. A binary distribution for Windowsの64-bit versionのftpまたはhttpをクリックしてDLします
    doxy
  4. 適当な場所に解凍します。今回はD:\Program1に
  5. doxygen.exeのあるディレクトリにPATHを通す。

さすがにPATHの通し方なんて書かなくても大丈夫だよね・・・?コマンドプロンプト

doxygen --version

として落としたバージョンが表示されれば成功です。

DL & 解凍編

Eigen

全部解凍する。CMake以外は同じパスにおいたほうが便利じゃないかな。ってことでC:\lib以下においています。

CMake編(32bit)

以下説明の都合上、

OpenCV C:\lib\opencv-3.1.0
opencv_contrib C:\lib\opencv_contrib-3.1.0
Eigen C:\lib\eigen-eigen-b30b87236a1b
Intel(R) TBB C:\lib\tbb44_20151115oss
cmake-gui.exe D:\Program1\cmake-3.4.1-win32-x86\bin
python.exe C:\Python34

にあるとします。適宜パスはよみかえてください。

  1. cmake-gui.exeを起動する
  2. 以下のように入力し、configureをclickする
    Where is the source code C:\lib\opencv-3.1.0
    Where to build the binaries C:\lib\opencv-3.1.0\build
    1
  3. フォルダを作成するか聞いてきたらyesと答える
    2
  4. とりあえず32bit向けのbuildがしたいので、「Visual Studio 14 2015」を選ぶ。64bit向けには、「Visual Studio 14 2015 Win64」を。
    3
  5. しばらく待つと、エラーが出るが、気にしない。OKを押す
    4 5
  6. searchにexamと打つと「BUILD_EXAMPLES」という項目があるので、チェックする
    6
  7. WITH_CUDAは必ずOFFにする!理由は前述のとおり。
    7
  8. searchにextと打つと「OPENCV_EXTRA_MODULE_PATH」があるので、
    C:\lib\opencv_contrib-3.1.0\modules
    とうち、下のサジェストをクリックする。こうすることで'\'(バックスラッシュ)が'/'に置き換わる。
    8
  9. searchにtbbと打つと、「WITH_TBB」があるので、チェックを付ける
    9
  10. searchにeiと打つと、「Eigen_INCLUDE_PATH」があるので、
    C:\lib\eigen-eigen-b30b87236a1b
    とうち、下のサジェストをクリックする。こうすることで'\'(バックスラッシュ)が'/'に置き換わる。
    10
  11. searchにpyと打つとpython関連の設定項目が出てくる。以下のように設定する。
    BUILD_opencv_python2 チェックしない
    BUILD_opencv_python3 チェックする
    INSTALL_PYTHON_EXAMPLES チェックする
    PYTHON3_LIBRARY_DEBUG C:/Python34/symbols
    11
  12. configureをクリックする
  13. なんかエラーが出るのでOKする
    12
  14. TBB_INCLUDE_DIRSに
    C:\lib\tbb44_20151115oss\include
    とうち、下のサジェストをクリックする。こうすることで'\'(バックスラッシュ)が'/'に置き換わる。
    そしてconfigureをクリックする
    13
  15. searchにtbbと打つと「TBB_LIB_DIR」があるので、
    C:\lib\tbb44_20151115oss\lib\ia32\vc14
    とうち、下のサジェストをクリックする。こうすることで'\'(バックスラッシュ)が'/'に置き換わる。
    ia32のところは、64bitビルドの時はintel64にするように!
    そしてconfigureをクリックする
    14
  16. generateをクリックする
    15

Build編(32bit)

  1. C:\lib\opencv-3.1.0\build
    にあるOpenCV.slnを開く
    sln
  2. 下のステータスバーに「準備完了」と出るまでしばらく待つ。私はIntelliSenseの解析は終わらせてからやる派です(ただの趣味)。
    vs_ready
  3. ビルド→バッチビルドをクリックする
    bat_build1
  4. INSTALLを探し、Debug/Releaseともにチェクをつけ、ビルドを押す。
    bat_build2
  5. 前述のとおり、opencv_python3のDebug buildに失敗して終了する。
    python3_x86debug_fail

CMake編(64bit)

CMakeは前回の時のcacheが残るので、fileからdelete cacheする

基本的にはCMake編(32bit)と同じだけど、pythonは64bitでビルドする意味がわからないので(numpyの関係上)、
BUILD_opencv_python3とINSTALL_PYTHON_EXAMPLES
のチェックを外す。

TBB_LIB_DIRの設定は、ia32のところは、64bitビルドの時はintel64にするのをお忘れなくように!

Build編(64bit)

Build編(32bit)と全く同じなので割愛

環境変数

なくてもいいんだけど、あったほうが楽なので。

OPNECV_ROOTに、C:\lib\opencv-3.1.0\build\installを設定。

dllとかとか配置編

一般にはPATHを通すようですが、今回はそうしません。

コピー元 コピー先
C:\lib\opencv-3.1.0\build\install\x86\vc14\bin C:\Windows\SysWOW64
C:\lib\tbb44_20151115oss\bin\ia32\vc14 C:\Windows\SysWOW64
C:\lib\opencv-3.1.0\build\install\x64\vc14\bin C:\Windows\System32
C:\lib\tbb44_20151115oss\bin\intel64\vc14 C:\Windows\System32

こんな感じでコピーしてくだい。dllだけでいいですが、面倒なら全部いれてかまいません。間違えやすいので注意!

python版のインストール

まず先ほどまでの手順で
C:\lib\opencv-3.1.0\build\lib\python3\Release
cv2.pydがあるはずなので確認してください。

さらに、
C:\Python34\Lib\site-packages
をみると、すでにcv2.pydがコピーされています。マジ有能。

コピー元 コピー先
C:\lib\opencv-3.1.0\build\install\x86\vc14\bin C:\Python34\Lib\site-packages
C:\lib\tbb44_20151115oss\bin\ia32\vc14 C:\Python34\Lib\site-packages

こんな感じでコピーしてくだい。dllだけでいいです

python版の確認

pythonコマンドプロンプトに打ってインタープリタを立ち上げ、import cv2とか、cv2.__version__とかしてあげてください。

C:\Users\yumetodo>python
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.1.0'
>>> exit()

あとは、C:\lib\opencv-3.1.0\build\install\samples\native\pythonにある、browse.pyとかを走らせても楽しそうです。
previwウィンドウでマウスを動かすとマウス周辺の拡大図がzoomウィンドウに表示されます。

Visual Studioのプロジェクト設定&Sample実行編

  1. 構成:すべての構成
    プラットフォーム:すべてのプラットフォーム
    の状態で
    構成プロパティ→C/C++→全般→追加のインクルードディレクトリに
    $(OPENCV_ROOT)/include
    を追加、適用を押す
  2. 構成:すべての構成
    プラットフォーム:すべてのプラットフォーム
    の状態で
    構成プロパティ→リンカー→全般→追加のライブラリ ディレクトリに
    $(OPENCV_ROOT)/$(PlatformTarget)/vc14/lib
    を追加、適用を押す
  3. 構成:すべての構成
    プラットフォーム:すべてのプラットフォーム
    の状態で
    構成プロパティ→C/C++ー→コード生成→C++の例外を有効にするで
    はい-SEHの例外あり (/EHa)
    を選択(OpenCVのビルド時と揃える、つまりCMAKEのCMAKE_CXX_FLAGSと同じにする意味がある)
    構成プロパティ→C/C++ー→コード生成→浮動小数点モデルで
    Fast (/fp:fast)
    を選択、適用を押す
  4. 構成:Debug
    プラットフォーム:すべてのプラットフォーム
    の状態で
    構成プロパティ→リンカー→入力→追加の依存ファイル→入力欄クリック→右側の下矢印をクリック→編集で
    opencv_core310d.lib
    opencv_highgui310d.lib
    opencv_imgproc310d.lib
    opencv_objdetect310d.lib
    を追加する。バージョン番号は適当に読み替えてください。
  5. 構成:Release
    プラットフォーム:すべてのプラットフォーム
    の状態で
    構成プロパティ→リンカー→入力→追加の依存ファイル→入力欄クリック→右側の下矢印をクリック→編集で
    opencv_core310.lib
    opencv_highgui310.lib
    opencv_imgproc310.lib
    opencv_objdetect310.lib
    を追加する。バージョン番号は適当に読み替えてください。

という感じで設定したら、適当にサンプルをビルドしてみましょう。

#include <opencv2/core/core.hpp>       // coreモジュールのヘッダーをインクルード
#include <opencv2/highgui/highgui.hpp>  // highguiモジュールのヘッダーをインクルード
#include <iostream>
 
int main(int argc, const char* argv[])
{
  // 1幅320px、高さ240pxで赤色の画像データを生成
  cv::Mat redImg(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255));
 
  // 2画像表示用のウィンドウを生成
  cv::namedWindow("red", cv::WINDOW_AUTOSIZE);
 
  // 3ウィンドウに画像を表示
  cv::imshow("red", redImg);
 
  // 4キー入力を待機
  cv::waitKey(0);
 
  // 5作成したウィンドウを全て破棄
  cv::destroyAllWindows();
 
  return 0;
}