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

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

OpenCV 2.4.9導入-with CMake

OpewnCV3.1対応の記事を改めて書きました。
OpenCV3.1の導入withCMake
そちらを御覧ください。

今回はOpenCVを導入します。というのも今高速でスクリーンショットを取るソフトを作ってるのですが、なんかOpenCV使った方がいいみたいなことを知恵袋で言われたので。

OpenCVとは

ざっというと画像処理に関するプログラミングを超強力にアシストしてくれるライブラリーです。詳細は
http://www.buildinsider.net/small/opencv/01
に譲ります。(なんで対応画像形式にppmの表記を省くの・・・)

追記<br/ > 記載漏れです。次回更新時に修正したいと思います。 <br/ > 2014-12-04(23:16) :dandelion<br/ > とのことです。 わざわざ有り難うございます。

目標

  • CMakeを使ってWin32、x64両対応できるように導入する

環境

項目内容
OpenCVバージョン OpenCV 2.4.9
Visual Studio Visual Studio 2013 Express for Desktop Update4
ビルド構成 Win32 or x64 | Debug or Release
OS Windows 7 Homr Premium(64bit)
筆者が確認した環境

え、「Visual Studio Community 2013」?知らない子です

手順抜粋

ざっというと

  1. CMakeと、OpenCVソースコード(zip)をDL
  2. CMakeでconfigureとGenerate
  3. Visual Studio 2013 ExpressでDebug or Release計2回ビルド
  4. 2に戻る。結果的には4回ビルドしてる
  5. includeとか設定
  6. テンプレート化

です。

なお、先ほど紹介したbuildinsiderの中の人がこれをバッチ化していらっしゃるのでそれを利用するのも手です(私はバッチいじるよりGUIをクリックする派なので検証はご遠慮させていただきます。)

CMakeによるソリューション生成とビルド用のバッチファイルを公開しているのでご参考ください。
https://gist.github.com/atinfinity/51ce4794d0254ab63328
2014-12-04(23:16) :dandelion

手順詳細

以下、
OpenCVの環境構築(OpenCV 2.4.9) - Build Insider
http://www.buildinsider.net/small/opencv/02
初めてのOpenCV開発 ― Visual Studio/CMake/NuGetでプロジェクト作成【OpenCV 2.4.9】
http://www.buildinsider.net/small/opencv/03
cappriciosso: OpenCV 2.3.1の開発環境をVisual Studio 2010で構築する(Windows 7 Ultimate 64bit)
http://entropiajp.blogspot.jp/2012/05/opencv-231visual-studio-2010windows-7.html
OpenCV Ver.2.4.9 をインストールする|りさーちゃーのたまご
http://ameblo.jp/morimoridiary/entry-11857524071.html
OpenCV2.3の入手、ダウンロード、インストール、環境設定 | イメージングソリューション
http://imagingsolution.net/program/opencv/opencv2-3/opencv2-3-downlaod-install/
を参照しつつ見てください。

  1. CMakeをダウンロードする
    http://www.cmake.org/download/
    よりLatest Releaseのものを落とす。今回は「cmake-3.0.2-win32-x86.zip
  2. OpenCVソースコード(zip版)を落とす。
    https://github.com/Itseez/opencv/releases

    今回は「opencv-2.4.9.zip」
  3. 2つとも解凍し、
    C:\lib\
    にフォルダーごと入れる
  4. C:\lib\cmake-3.0.2-win32-x86\bin
    のcmake-gui.exeを管理者権限で実行する。こうしないとまれにCMakeがこけるらしい。<br/ >いやね、dandelion氏のご指摘通りそんなことしなくてもいいとは思うんだけど、見かけたのが管理者権限が必要なところにファイルを出力してないのにエラーがあったみたいな話だったような気がするので(どこだ、見つからない・・・)。
  5. 順に
    C:/lib/opencv-2.4.9

    C:/lib/opencv-2.4.9\build

    と入力、configureする。
    Generator(コンパイラー)選択は画像の通り。最終的にWin64がついてる奴とそうでない奴両方やるが、とりあえず「Visual Studio 12 2013 Win64」を選択。

    「CMAKE_CXX_FLAGS」のところに『"/DWIN32 /D_WINDOWS /W3 /GR /EHa /Zm150" 』みたいに「/EHa 」を指定する必要があるそうです(MaverickTse氏指摘)
    「WITH_CUDA」のチェックはなんとなくつけたまま。
    「WITH_CUDA」のビルドの長さについての考察は
    OpenCV2.4.10.1のビルド - AkiWiki---CUDAのアーキテクチャを指定した場合 <br/ > 参照。<br/ > 設定を変更するときは変更後必ず再度configureする。

  6. Generateをクリック。Policy CMP0026が云々が出てきても気にしない。

  7. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets
    のアクセスコントロールを全ユーザーでフルコントロール
    これしないとビルドエラーで怒られた。あともう一箇所アクセスコントロールをいじんなきゃいけなかったんだけどどこだっけ・・・。友人のPCので実験したらそんなことならなかったんだけどなんでだろ。
  8. C:\lib\opencv-2.4.9\build
    OpenCV.slnをVisual Studioで開く。
  9. ソリューション、プラットフォーム構成がRelease|x64になっているか確認。
  10. ソリューションエクスプローラーでCMakeTargetsのINSTALLを右クリックしてスタートアッププロジェクトに設定し同じく右クリからビルド。
  11. Unicodeでソースを保存しなおせとかはすべてスルー。どうせコメント部分が引っかかってるんだろう。
    エラーがでた時はもう一度CMakeTargetsのINSTALLを右クリックしてビルドするとさくっと通ることも。
  12. ソリューション、プラットフォーム構成がDebug|x64にして同様にビルド。
  13. cmake-gui.exeを管理者権限で実行、File→Delete Cacheをクリック。
  14. PC再起動。そのまま続けようとすると「C:\lib\opencv-2.4.9\cmake」にアクセス出来ないとかで怒られたので。これまた友人のPCで実験したら必要なかったんだけど。
  15. 手順5に戻る。今度は「Visual Studio 12 2013」を選択。同様にconfigure、Generate。
  16. OpenCV.slnをVisual Studioで開き、ソリューション、プラットフォーム構成がRelease|WIn32になっているか確認、同様にビルド。
  17. ソリューション、プラットフォーム構成がDebug|WIn32になっているか確認、同様にビルド
  18. 環境変数への追加を普通はやるがここでは別の方法を取る
    C:\lib\opencv-2.4.9\build\install\x86\vc12\bin以下のファイルすべて

    C:\Windows\SysWOW64
    にコピー。
    C:\lib\opencv-2.4.9\build\install\x64\vc12\bin以下のファイルすべてを

    C:\Windows\System32
    にコピー。
    まちがって逆にしないこと。
  19. C:\lib\opencv-2.4.9\build\install
    以外は単純にライブラリを使うだけであれば消してもいいが、別に空き容量に困ってるわけではないので放置する。
  20. 適当に「opencvsample1」とかいう名前でコンソールアプリケーションを作り―の
    http://www.buildinsider.net/small/opencv/03
    の「2.2 新規プロジェクト作成(64bitアプリケーションの場合)」をやる。ソースファイルはまだいらない。
  21. ソリューションエクスプローラーでプロジェクトを選択してる状態でプロジェクト→プロパティとクリックする
  22. 構成:すべての構成
    プラットフォーム:すべてのプラットフォーム
    の状態で
    構成プロパティ→C/C++→全般→追加のインクルードディレクトリに
    C:\lib\opencv-2.4.9\build\install\include
    を追加、適用を押す
  23. 構成:Debug
    プラットフォーム:すべてのプラットフォーム
    の状態で
    構成プロパティ→リンカー→入力→追加の依存ファイル→入力欄クリック→右側の下矢印をクリック→編集で
    opencv_core249d.lib
    opencv_highgui249d.lib
    opencv_imgproc249d.lib
    opencv_objdetect249d.lib
    を追加する
  24. 構成:Release
    プラットフォーム:すべてのプラットフォーム
    の状態で
    構成プロパティ→リンカー→入力→追加の依存ファイル→入力欄クリック→右側の下矢印をクリック→編集で
    opencv_core249.lib
    opencv_highgui249.lib
    opencv_imgproc249.lib
    opencv_objdetect249.lib
    を追加する
  25. 構成:すべての構成
    プラットフォーム:x64
    の状態で
    構成プロパティ→リンカー→全般→追加のライブラリーディレクトリで
    C:\lib\opencv-2.4.9\build\install\x64\vc12\lib
    を追加
  26. 構成:すべての構成
    プラットフォーム:Win32
    の状態で
    構成プロパティ→リンカー→全般→追加のライブラリーディレクトリで
    C:\lib\opencv-2.4.9\build\install\x86\vc12\lib
    を追加
  27. プロパティページを閉じる
  28. ファイル→テンプレートのエクスポートで

    プロジェクトテンプレート→

    テンプレート名「OpenCV_core_win32_x64_Console」

    テンプレートの説明「http://www.buildinsider.net/small/opencv/03

    アイコンのイメージ:適当に↓とか

    http://www.laganiere.name/img/opencv.bmp

    で完了を押す。

  29. 多分導入完了

確認

さっきのプロジェクトにソースファイルを追加して

#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;
}

と入力、全4パターンビルドしてみる。私の場合はなぜかDebug|Win32の時だけウィンドウタイトルの文字が文字化けする。なんで?

メモ

コメント欄にて

2> float-point model: fast OCV3 use float-point model=fast instead of the default "precise", so in your own project, there's not much point using the default "precise". Change it to "fast" to crank out a bit performance

というご指摘を頂いた。これは2.x系でもライブラリのビルド時、およびライブラリを利用したプログラムのビルド時双方で、float-point model=fastを使え、ということなのだろうか。なんかよくわからない・・・。 ちなみにfloat-point model=fastっていうのはプロジェクトのプロパティ→構成プロパティ→C/C++→すべてのオプション→浮動小数点モデル のことだと思う(あってるかな?)。