OpenCV Windows - eiichiromomma/CVMLAB GitHub Wiki
(OpenCV) OpenCV 2.xのWindows (C/C++) での開発環境の構築
ここが良く纏まってる。
Visual StudioにNuGetというパッケージ管理機能が追加され,プロジェクト単位で任意のOSSを取り込めるようになった。
Visual Studioの[ツール]-[拡張機能と更新プログラム]からNuGet Package Managerを更新する
新しいプロジェクトとしてWin32コンソールアプリケーションを作成し,ソリューションエクスプローラで右クリックして[NuGetパッケージの管理]を選択
OpenCVを検索してインストールボタンを押す
あとは普通にソースファイルに新しくC++ファイルを追加してOpenCVのプログラムを書けば動く。パス等を考えずに済んで楽。
OpenCV-2.3.1-win-superpack.exeを配布元から入手する。
従来のインストーラと異なりSuperPackはPATHやスタートメニューの登録はしない。 様々な環境や条件でのコンパイル済のライブラリやヘッダファイルが含まれているのでサイズが大きいが、すべてを保持する必要はない。
以下c:\local\にインストールする前提で話を進める。
- 下記のフォルダ構成(## )から必要なものを選んでbinとlibをc:\local\にコピー
- includeをC:\local\にコピー
- 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にc:\local\binを追加する。
PATHは設定した後に起動したプログラムに対しては有効となる事に注意。 ログインしなおすか再起動が確実。
- Win32コンソールアプリケーションの空のプロジェクトを作成
- ソースファイルフォルダで右クリックして追加->既存の項目を選びsamples\cpp\image.cppを選択
- プロジェクトのプロパティの「C/C++->全般」から追加のインクルードディレクトリにc:\local\includeとc:\local\include\opencvを追加
- 「リンカー->全般」から追加のライブラリディレクトリにc:\local\libを追加
- 「リンカー->入力」から追加の依存ファイルに使用する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)
Debugの場合tbb_debug.dllが何故か含まれていないのでエラーが出る。 TBB Downloadからtbb30_20110427oss_win.zipを入手して適切なフォルダからtbb_debug.dllをc:\local\binにコピーすると動くようになる。
VisualC 2008を参照。 基本的な動作に必要なPlatform SDKは含まれている。
コンパイラが無いと話にならないので、持ってない場合はVisualC Installを参照。
highgui.hがwindows.hを必要とするので、ウィンドウを開くアプリケーションはPlatform SDKが必須となる。
詳細はPlatformSDK参照
インストール先はCustomインストールでC:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\にしておく。
配布元からインストーラ(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のdllとmsvcvr90.dllが無いと言われて動かない。 OpenCVのdllはインストール先のbinフォルダに.dllファイルがあるので作成した.exeファイルと一緒に置くと良い。 msvcrXXはマイクロソフトで再頒布可能ファイルとして配っているので拾ってインストールする。
プロジェクトのプロパティの[リンカ]-[マニフェストファイル]-[追加のマニフェスト依存関係]に以下の内容を追加する。 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>