OpenCV Windows - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) OpenCV 2.xのWindows (C/C++) での開発環境の構築

ここが良く纏まってる。

NuGetを使った環境構築 (2.4.x以降, Visual Studio 2012, 2013)

Visual StudioにNuGetというパッケージ管理機能が追加され,プロジェクト単位で任意のOSSを取り込めるようになった。

NuGetの更新 (Visual Studio 2012)

Visual Studioの[ツール]-[拡張機能と更新プログラム]からNuGet Package Managerを更新する

プロジェクトへの導入

新しいプロジェクトとしてWin32コンソールアプリケーションを作成し,ソリューションエクスプローラで右クリックして[NuGetパッケージの管理]を選択

OpenCVを検索してインストールボタンを押す

あとは普通にソースファイルに新しくC++ファイルを追加してOpenCVのプログラムを書けば動く。パス等を考えずに済んで楽。

Ver. 2.3.1SuperPackを使った環境構築

SuperPackの導入

OpenCV-2.3.1-win-superpack.exeを配布元から入手する。

従来のインストーラと異なりSuperPackはPATHやスタートメニューの登録はしない。 様々な環境や条件でのコンパイル済のライブラリやヘッダファイルが含まれているのでサイズが大きいが、すべてを保持する必要はない。

以下c:\local\にインストールする前提で話を進める。

  1. 下記のフォルダ構成(## )から必要なものを選んでbinとlibをc:\local\にコピー
  2. includeをC:\local\にコピー
  3. common\tbbから必要な環境のdll等をc:\local\binにコピー

ドキュメントやsampleは必須ではないが参考にすることが多い

フォルダ構成

    opencv
    ├─3rdparty #リビルド用
    ├─android #Androidプラットフォーム用ファイル
    ├─build #コンパイル済みのライブラリ
    │  ├─common 
    │  │  ├─tbb #該当する環境にパスを通すかパスの通った場所に移動
    │  │  │  ├─ia32 #32bit
    │  │  │  │  ├─vc10 #vc10 = Visual Studio 2010。以下同様
    │  │  │  │  ├─vc8
    │  │  │  │  └─vc9
    │  │  │  └─intel64 #64bit
    │  │  │      ├─vc10
    │  │  │      ├─vc8
    │  │  │      └─vc9
    │  │  └─x86 #顔認識(Adaboost)、Stitchingのコンパイル済のプログラム
    │  ├─gpu #WITH_CUDAでコンパイルした環境(## )
    │  │  ├─x64
    │  │  │  ├─bin
    │  │  │  └─lib
    │  │  └─x86
    │  │      ├─bin
    │  │      └─lib
    │  ├─include #ヘッダファイル(必須)
    │  │  ├─opencv
    │  │  └─opencv2
    │  ├─python #Python環境
    │  │  ├─2.6
    │  │  └─2.7
    │  ├─x64 #64bit用環境(## )
    │  │  ├─mingw #Mingw用
    │  │  │  ├─bin
    │  │  │  └─lib
    │  │  ├─vc10
    │  │  │  ├─bin
    │  │  │  ├─lib
    │  │  │  └─staticlib
    │  │  └─vc9
    │  │      ├─bin
    │  │      ├─lib
    │  │      └─staticlib
    │  └─x86 #32bit環境用(## )
    │      ├─mingw
    │      │  ├─bin
    │      │  └─lib
    │      ├─vc10
    │      │  ├─bin
    │      │  ├─lib
    │      │  └─staticlib #静的リンクライブラリ
    │      └─vc9
    │          ├─bin
    │          ├─lib
    │          └─staticlib
    ├─data #顔、人体、顔パーツ認識に使う学習データ
    │  ├─haarcascades
    │  └─lbpcascades
    ├─doc #ドキュメント(推奨)
    │  ├─pattern_tools
    │  ├─tutorials
    ├─include #リビルド用ヘッダ
    ├─modules #リビルド用ソース
    └─samples #各環境、言語でのサンプル(推奨)

PATHの設定

コントロールパネルのシステムの詳細設定から環境変数の設定を開きPATHにc:\local\binを追加する。

PATHは設定した後に起動したプログラムに対しては有効となる事に注意。 ログインしなおすか再起動が確実。

プログラム作成の練習

Visual Studioのプロジェクトの作成

  1. Win32コンソールアプリケーションの空のプロジェクトを作成
  2. ソースファイルフォルダで右クリックして追加->既存の項目を選びsamples\cpp\image.cppを選択
  3. プロジェクトのプロパティの「C/C++->全般」から追加のインクルードディレクトリにc:\local\includeとc:\local\include\opencvを追加
  4. 「リンカー->全般」から追加のライブラリディレクトリにc:\local\libを追加
  5. 「リンカー->入力」から追加の依存ファイルに使用するlibファイルを登録

この際にプロジェクトの構成がDebugの場合はopencv_モジュール名バージョン番号.dllではなく.dllの前に「d」が付いたopencv_モジュール名バージョン番号d.dllを指定する。

モジュールはcore, imgproc, highguiに必要な機能を追加する場合が多い。 使用しているモジュールを明確にする為にもincludeは #include "opencv2/core/core.hpp" のような形式で書いた方が分かりやすい。

プロジェクトのプロパティから「デバッグ->コマンド引数」に適当な画像ファイルのフルパスを入力してデバッグで実行する。画像が表示されれば成功。 (例えばc:\にsuperpackを展開した場合はc:\opencv\samples\cpp\lena.jpg)

tbb_debug.dllが無い

Debugの場合tbb_debug.dllが何故か含まれていないのでエラーが出る。 TBB Downloadからtbb30_20110427oss_win.zipを入手して適切なフォルダからtbb_debug.dllをc:\local\binにコピーすると動くようになる。

Windowsでの開発環境構築についてのまとめ ※Ver. 1.x環境

ビルド環境のインストール

VisualC++ 2008のインストール

VisualC 2008を参照。 基本的な動作に必要なPlatform SDKは含まれている。

VisualC++ 2005のインストール(旧情報)

コンパイラが無いと話にならないので、持ってない場合はVisualC Installを参照。

Platform SDKのインストール(Visual C++ 2005のみ)

highgui.hがwindows.hを必要とするので、ウィンドウを開くアプリケーションはPlatform SDKが必須となる。

詳細はPlatformSDK参照

インストール先はCustomインストールでC:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\にしておく。

OpenCV一式のインストール

配布元からインストーラ(opencv-win)を拾ってきて実行するだけ。 パスの指定も勝手にやってくれる。

インクルードファイルパスの指定

VisualC インクルードパスを参照のこと

正規の方法

以下のフォルダをインクルードファイルパスで指定する

  cv\include
  cvaux\include
  cxcore\include
  otherlibs\cvcam\include
  otherlibs\highgui
  ml\include

変則的なやり方

ヘッダファイル(## .h, ## .hpp)とライブラリファイル(## .lib)はOpenCVのフォルダ以下に散り散りになってしまっていて、後々の扱いが面倒なので一箇所にコピーしてしまう。 (但しバージョンアップの際に旧バージョンが残らないように注意する必要がある) ※好みの問題もあるので嫌な人は、↑の正規の方法でインクルードパスを指定する。

ヘッダファイルは以下のフォルダの.hと.hppをコピーする。

  cv\include
  cvaux\include
  cxcore\include
  otherlibs\cvcam\include
  otherlibs\highgui
  ml\include

ヘッダファイルはそれぞれ必要に応じてincludeする。ライブラリはヘッダファイルに応じてWindows/VisualC/プロジェクトへのライブラリの追加を参照して追加する。

  • cv.h: OpenCVの核となるヘッダ(必須)
  • cvaux.h: 実験的機能
  • cvcam.h: カメラを扱う
  • highgui.h: ウィンドウなどのGUI

VCでのインクルードパスの追加を参照してC:\Program Files\OpenCV\includeを追加。

ライブラリファイルパスの指定

ライブラリファイルはC:\Program Files\OpenCV\libに入っているので、VisualC ライブラリパスを参照してC:\Program Files\OpenCV\libを追加。

OpenCVを使ったアプリケーションを他のマシンで動かす場合

当然だが開発した環境ではすんなり動くが、ほかの環境だとOpenCVのdllとmsvcvr90.dllが無いと言われて動かない。 OpenCVのdllはインストール先のbinフォルダに.dllファイルがあるので作成した.exeファイルと一緒に置くと良い。 msvcrXXはマイクロソフトで再頒布可能ファイルとして配っているので拾ってインストールする。

msvcrXX.dllのランタイムエラーを防ぐには

スマートな方法

プロジェクトのプロパティの[リンカ]-[マニフェストファイル]-[追加のマニフェスト依存関係]に以下の内容を追加する。 type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' バージョン等はdllの置いてある

  C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375

のようなフォルダ名に対応している。

msvcr80の場合は下の旧情報を参考にバージョンを変えて設定すると、manifestファイルを作ったりdllを置く必要がなくなる。

旧情報

以下の内容のファイルをMicrosoft.VC80.CRT.manifestとしてdllと共にプログラムと同じフォルダにおく必要がある。

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <!-- Copyright c 1981-2001 Microsoft Corporation -->
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <noInheritable/>
      <assemblyIdentity 
          type="win32" 
          name="Microsoft.VC80.CRT" 
          version="8.0.50608.0" 
          processorArchitecture="x86" 
          publicKeyToken="1fc8b3b9a1e18e3b"
      />
      <file name="msvcr80.dll"/>
      <file name="msvcp80.dll"/>
      <file name="msvcm80.dll"/>
  </assembly>
⚠️ **GitHub.com Fallback** ⚠️