2014年4月20日日曜日

OpenCV を Visual Studio で使う方法

【更新情報】2013年11月19日 最新版2.4.7に 対応しました。2.4.7よりVS2008へのサポートがなくなったため、VS2008関連の解説に取り消し線をつけました。
【更新情報】2014年4月3日 VS2008関連の解説を削除し、VS2013関連の記述を追加しました。
【更新情報】2014年4月20日 最新版2.4.8に対応しました。VS2013関連の記述を修正しました。3.の記述を簡略化しました。
【更新情報】2014年5月22日 最新版2.4.9に対応しました。他のサンプルコードを使うための記述を追加しました。
【更新情報】2014年6月2日 一部のstrikeをコメントアウトしました。また5.でVS再起動の記述を追加しました。サンプルコードを変更しました。

///////////////////////////////////////////
Visual Studio 2017 + x64 + OpenCV 3.2.0 の記述を新ブログに書きました。参考にしてください。 (2017年4月13日)
質問受け付けも新ブログへ
http://phst.hateblo.jp/entry/2016/11/30/081749
///////////////////////////////////////////


Visual Studio 2010 Professional, Visual Studio 2012, Visual Studio 2013を使っている人で、OpenCVをx86(通常)で動かす予定の人は、Visual Studioが提供するパッケージ管理ツールNuGetを使うと便利です。このブログでもいずれ解説したいと思いますが、下記のウェブサイトに情報がほぼ網羅されていますので、ぜひ見てください。
http://whoopsidaisies.hatenablog.com/entry/2013/12/03/174709

x64でプログラムを作成したい人は、以下の解説通りにすることをおすすめします。

Windows7、Windows8、Windows8.1環境で、OpenCVをVisual Studioで始める方法の解説です。最も簡単に構築できる方法を試行錯誤して到達したやり方を記述しています。簡単に始めたい人、早く始めたい人、初心者向けの解説ですのでご注意ください。

ファイル名・フォルダ構成・プロジェクト名は本来自由に決めることができますが、ここでは説明を簡略化し初心者にもわかりやすくするために固定にします。

Microsoft Visual Studio 2010、2012、2013のいずれかがインストールされていることが前提です。Visual Studio(VS)をインストールしていない人は先にVSのインストールを行ってください。Expressバージョンでも問題ありませんが、当環境ではUltimateバージョンでテストを行っています。

ここで行う作業は以下の通りです。
  1. OpenCVライブラリのダウンロード
  2. OpenCVライブラリの展開
  3. 静的リンクライブラリの設定
  4. 動的リンクライブラリの設定
  5. VisualStudioの設定
  6. サンプルプログラムの作成と起動
  7. 他のサンプルコードを使う

1.OpenCVライブラリのダウンロード

http://opencv.org/downloads.html

VERSION2.4.9の「OpenCV for Windows」と書いてあるリンクをクリックしてください

初めての人はVERSION2.4.9で試されることを強く勧めます。

sourceforge.netのサイトへ飛ばされ、しばらくするとダウンロードが開始されます。

2.OpenCVライブラリの展開

ダウンロードしたOpenCV-2.4.9.exeを展開します。
.exeを実行すると自己展開が始まるので、Extract to:を「C:\」にして実行してください。約4GBのディスク容量を使います。

展開に成功すれば、「C:\opencv」ができ「C:\opencv\build\include\opencv2」をみると「opencv.hpp」と「opencv_modules.hpp」と複数のフォルダができています。
次の3.はここで作業を行います。

3.静的リンクライブラリの設定(リンカ用ヘッダー作成)

OneDriveからバージョンに合った「opencv_lib.hpp」をダウンロードして、「C:\opencv\build\include\opencv2」のフォルダに置きます。

4.動的リンクライブラリの設定(実行ファイルの場所を指定)

スタートメニューを開き、「システム」と検索し「システム」を開きます(システム***は沢山ありますが、「システム」を選びます。)。システムの詳細設定を開きます。
詳細設定から環境変数を選び、システム環境変数から変数が「Path」のものを選び編集を選択します。

最後に「;」が入っていればその後ろに次の文字列をペーストします。
「;」が入っていなければ「;」を入れてその後ろにペーストします。
この作業はシステムの設定に関わる作業なので、慎重に行ってください。

ペーストする文字列はVS2010 か VS2012 か VS2013 かで分岐します。32bit、64bitはOSのバージョンではなく、プログラムの構成時のプラットフォームです。一般的にVSを立ち上げた時にはx86プラットフォームで動くので、32bitの場合で良いでしょう。

32bit(x86):通常 64bit(x64)
VS2010 C:\opencv\build\x86\vc10\bin C:\opencv\build\x64\vc10\bin
VS2012 C:\opencv\build\x86\vc11\bin C:\opencv\build\x64\vc11\bin
VS2013 C:\opencv\build\x86\vc12\bin C:\opencv\build\x64\vc12\bin
ここまでで、Windowsの設定は完了です。

5.VisualStudioの設定

Visual Studioをすでに起動している場合は、一度終了して起動します。これで4.の設定がVisual Studioに反映されます。
ファイル→新規作成→Visual C++→全般→空のプロジェクト
を選択し、プロジェクト名は適当に決めます。今回は「OpenCV_Test」とします。
プロジェクト→プロパティを選択します。

構成プロパティ→VC++ディレクトリを選択し、インクルードディレクトリの右の▼をクリックし、編集を選択し、「C:\opencv\build\include」を追加します。
さらにライブラリディレクトリに同様に次の文字列を追加します。
32bit(x86):通常 64bit(x64)
VS2010 C:\opencv\build\x86\vc10\lib C:\opencv\build\x64\vc10\lib
VS2012 C:\opencv\build\x86\vc11\lib C:\opencv\build\x64\vc11\lib
VS2013 C:\opencv\build\x86\vc12\lib C:\opencv\build\x64\vc12\lib

6.サンプルプログラムの作成と起動


OpenCVがつかえる状態になったことを確認するために、サンプルプログラムを動かしてみます。ソースファイルで追加、新しい項目、C++ファイル(.cpp)で名前「main.cpp」で追加し、
//インクルードファイル指定
#include <opencv2/opencv.hpp>
//静的リンクライブラリの指定
#include <opencv2/opencv_lib.hpp> //NuGetの場合は必要ない
//名前空間の指定
using namespace cv;
int main()
{
 //width220, height150の画像を作成
 Mat src = Mat::zeros(150, 220, CV_8UC3);
 //赤色で画像にHello Worldを描く
 putText(src, "Hello World", Point(5, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 200), 2, CV_AA);
 //緑色で画像に線を描く
 line(src, Point(190, 25), Point(190, 45), Scalar(0, 200, 0), 3);
 //要素を直接操作し画像に点を描く
 for (int x = 188; x < 192; x++)
  for (int y = 53; y < 57; y++) //y座標
   for (int i = 0; i < 2; i++) //i < 3にするとBGRすべての要素を200にする
    src.at<uchar>(Point(x * 3 + i, y)) = saturate_cast<uchar>(200);
 //画像を表示
 imshow("", src);
 //ウインドウの表示時間(0はキーが押されるまで閉じない)
 waitKey(0);
 return 0;
}
を記述します。ビルドを行い、デバッグからデバッグなしで開始します。小さなウインドウが出てくると成功です。

7.他のサンプルコードを使う

たとえば、opencv.jpのサイトにはサンプルコードがたくさんあります。しかし、一部のコードはそのまま使うことはできません。次のように変更する必要があります。
#include <cv.h>
#include <highgui.h>
これがある場合は以下に変更してください。
#include <opencv2/opencv.hpp>
#include <opencv2/opencv_lib.hpp>

余談ですが、当ブログではオブジェクト指向の観点から、cvから始まる関数(cvNamedWindowとかcvShowImageとか)やIplImage構造体を用いた古いコードの利用は推奨していません。これらはOpenCV 1.0で使われていたコードであり、初心者とメモリに優しくないからです。(抽象的表現でごめんなさい)

名前空間を使った最新のコードの場合も、次の1行をmainが書いてあるファイルの1行目に追加してください。
#include <opencv2/opencv_lib.hpp>

解説は以上です。うまく行きましたか?トラブルが起きたら下のコメント欄で質問してください。うまく行ったときもコメントしてくれると嬉しいです。

OpenCV を Visual Studio で使う方法の解説
http://physics-station.blogspot.jp/2013/03/opencv-visual-studio_5.html