OpenCV導入 Visual Studio 2013(&2012)編

***2014/09/12追記***
OpenCV導入について、私の以下の記事よりも、詳しい解説が数回にわたり[こちら](http://www.buildinsider.net/small/opencv/01)に掲載されております。こちらを参考に導入されることをおすすめします！

# 概要
OpenCVの導入方法には

+ 公式パッケージ
+ CMake
+ NuGet

の方法があるが、今回は公式パッケージよりインストールする方法を行う。
~~なお、VS2013(2012も同様)では2008のようにプロジェクトプロパティからインクルードディレクトリなどを設定すると、プロジェクト毎に設定する必要がある。ここでは個別に設定しないで済む方法を行っていく。~~
>（斜線部補足）この方法はOpenCVを必要としないプロジェクトの場合でもパスが通ってしまうとのご指摘があり、確かにOpenCV導入として掲載するのに相応しくない内容であったと思うので、記事最後のメモの項目に移動した。


VS2013用にOpenCVのパスを通すために、ライブラリのパス設定を記述したプロパティシートを作成し、それを読み込むことでプロジェクト設定を行う。
（VS2010,2012なども同様にできる）

>CMakeやNuGetについては[こちら](http://www.buildinsider.net/small/opencv/02)が参考になる。

# OpenCVのインストール
[公式サイト](http://opencv.org/)よりOpenCVのインストーラーをダウンロードし、インストールする。
(ここではCドライブにインストールしたものとする)

以下のようにDLLのパスを通す。（Visual Studio2012の場合は`vc12`の部分を`vc11`にする）
>※64bit版も追加する場合`C:\opencv\build\x64\vc12\bin`を以下同様に追加する
>![6fdf83cd-21fe-79cd-75db-145ba4179a7a.png](https://qiita-image-store.s3.amazonaws.com/0/49067/3900d842-2978-9a88-e823-bfc8a7f566c3.png)

***※かならずシステム環境変数を設定した後は再起動する***

# Visual Studioの設定　

## プロパティシートを作成する

[コメントで頂いたページ](https://gist.github.com/atinfinity/908035e157f54bdaafcf)が非常に参考になります。（感謝！）

>参考ページをそのまま改変しただけなので、私が作成したプロパティシートを掲載する必要もないかと思ったが、この記事通りの手順でCドライブにOpenCVをインストールしている方が居られるかもしれないので、念のため載せておく。

[今回作成したプロパティシート](https://gist.github.com/nyunyunyu/ff4fca0cbafebd27ab66)。（vc11なども同様にできる。参考ページがおすすめ）
これをどこかのディレクトリに保存しておく（後で使う）

## 動作チェック

以下の図のように用意したプロパティシートを適用する。

>![vc12.png](https://qiita-image-store.s3.amazonaws.com/0/49067/f78607f7-1603-ca1a-42ed-f4b034f70b79.png)

以下のコードが動作するかチェックする。

>（以下のコードは[こちら](http://opencv.jp/cookbook/opencv_img.html)を一部改変して使用させて頂きました）

```cpp
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/core/core.hpp>
#include <opencv/highgui.h>

/*プロパティシートに記述してるので必要なくなった
//Debug Mode
#ifdef _DEBUG
#pragma comment(lib, "opencv_imgproc249d.lib")
#pragma comment(lib, "opencv_core249d.lib")
#pragma comment(lib, "opencv_highgui249d.lib")
//Release Mode
#else
#pragma comment(lib, "opencv_imgproc249.lib")
#pragma comment(lib, "opencv_core249.lib")
#pragma comment(lib, "opencv_highgui249.lib")
#endif
*/
void main()
{
	// 初期化時に塗りつぶす
	cv::Mat red_img(cv::Size(640, 480), CV_8UC3, cv::Scalar(0, 0, 255));
	cv::Mat white_img(cv::Size(640, 480), CV_8UC3, cv::Scalar::all(255));
	cv::Mat black_img = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3);

	// 初期化後に塗りつぶす
	cv::Mat green_img = red_img.clone();
	green_img = cv::Scalar(0, 255, 0);

	cv::namedWindow("red image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
	cv::namedWindow("white image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
	cv::namedWindow("black image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
	cv::namedWindow("green image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
	cv::imshow("red image", red_img);
	cv::imshow("white image", white_img);
	cv::imshow("black image", black_img);
	cv::imshow("green image", green_img);
	cv::waitKey(0);
}
```

無事設定できていれば、４色のウィンドウが出てくる。

***以上でVS2013でのOpenCVの導入が終わりです。お疲れ様でした。***

これから新規プロジェクトを作る際は、作成したプロパティシートを適用するだけで、OpenCVのパス設定ができる。
>もちろん、core/highgui/imgproc以外のモジュールを使用する際は、`opencv_vc12.props`を編集する必要がある。

## メモ
>***この方法は非推奨なので、通常、利用しない方が良い***ようです。（コメント@dandelion1124様より端的かつ明確に理由を頂いております）
消そうかと思ったが、プロパティシートの勉強用にあえて残した。

すべてのプロジェクトでライブラリパスを通す方法。
なぜこのような方法を取ってしまったかというと、設定PCで常時ライブラリを利用する必要があり、他の方法を知らなかったため。

>自分で作成したプロパティシートを常時（つまり、すべてのプロジェクトで）読み込む方法も探ったが分からなかった。
>これが分かれば`Microsoft.Cpp.Win32.user.props``Microsoft.Cpp.x64.user.props`を編集する必要が無くなり、少しはハッピーに・・・なれたかも
>ご存知の方が居られましたらコメントなど頂けるとありがたいです。


パス設定方法はGUI上での操作とXMLを直接編集する(?)方法がある（やってることは同じ）が、どちらか片方で良い。（一応GUIとXML両方載せてある）

***GUIから設定***
適当な空のプロジェクトを作成（今回はCV_Test1）し、以下の１～３の手順に従って、プロパティマネージャを開き、`Microsoft.Cpp.Win32.user` or `Microsoft.Cpp.x64.user`をダブルクリック
>![kasisetu.png](https://qiita-image-store.s3.amazonaws.com/0/49067/e27ccb54-d877-39a2-50d7-672eb88961f3.png)

次に32bit版と64bit版それぞれ設定する

+ 32bit版
>![32.png](https://qiita-image-store.s3.amazonaws.com/0/49067/4f4b417a-f4df-b884-ec80-184ae2f28c4d.png)

+ 64bit版
>![64.png](https://qiita-image-store.s3.amazonaws.com/0/49067/8ce5306d-732a-34cd-55eb-08c9d7dc6ade.png)

***XMLから設定***
　`C:\Users\各ユーザー名\AppData\Local\Microsoft\MSBuild\v4.0`
の中にある
　`Microsoft.Cpp.Win32.user.props` `Microsoft.Cpp.x64.user.props`
をテキストエディタなどで開き、以下のようにopencvのインクルードパスとライブラリパスを追加する。（既に他のライブラリなどのインクルードパスなどが指定してある場合、消さずに追加だけする）

```Microsoft.Cpp.Win32.user.props
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
	<PropertyGroup>
		<IncludePath>C:\opencv\build\include;$(IncludePath)</IncludePath>
		<LibraryPath>C:\opencv\build\x86\vc12\lib;$(LibraryPath)</LibraryPath>
	</PropertyGroup>
</Project>
```

```Microsoft.Cpp.x64.user.props
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
	<PropertyGroup>
  		<IncludePath>C:\opencv\build\include;$(IncludePath)</IncludePath>
  		<LibraryPath>C:\opencv\build\x64\vc12\lib;$(LibraryPath)</LibraryPath>
	</PropertyGroup>
</Project>
```