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再起動の記述を追加しました。サンプルコードを変更しました。

///////////////////////////////////////////
以下の記述はメンテナンスされていません。
初心者は、NuGetから取得する方法をおすすめします。
NuGetからOpenCVをインストールした場合は、1から5までの手順を踏むする必要はありません。
6のサンプルコードを実行してみましょう。(2016年11月30日)
質問は、新ブログの質問受け付け 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

2013年4月1日月曜日

Sakura EditorでLaTeXを使う

サクラエディタでLaTexを使う方法について記述する。ここでは、便利なリンクと簡単な解説のみとする。

1.LaTex本体

バイナリはここにある
http://w32tex.org/index-ja.html
ので、「texinst2012.zip」をダウンロード・解凍し、中のファイルを「C:\tex」に移動する。

最小のインストールと書かれているファイルなどをダウンロードし、先ほどとは違うフォルダにまとめて保存する。

ちなみに、私は標準インストールの
dvipdfm-w32.tar.xz DVI to PDF driver dvipdfmx
と、フルインストールの
uptex-w32.tar.xz Unicode pTeX by Takuji Tanaka
もダウンロードした。DVIからPDFに直したかったし、Unicodeも使いたかったからだ。
他のファイルも必要に応じて追加でダウンロードするとよい。

で、「tar.xz」と最後に付くファイルが集められたフォルダを「texinst2012.exe」にドラッグ&ドロップし、しばらく処理が走るのを眺めれば、コンパイルは完了する。
後から追加したいのであれば、新しいフォルダにダウンロードした「tar.xz」たちが集められたフォルダをまた「texinst2012.exe」にドラッグ&ドロップすればよい。

ここの他のサイトの解説は、コマンドプロンプトをつかってごちゃごちゃやっているが、ここではGUIを使って簡単に済ませる。

次はPathの設定だ。OpenCVのインストールの投稿の必要なところだけ改変する。

スタートメニューからマイコンピュータを右クリックし、システムを呼び出し、システムの詳細設定を開く。詳細設定から環境変数を選び、システム環境変数から変数が「Path」のものを選び編集を選択する。

最後に「;」が入っていればその後ろに次の文字列をペーストする。「;」が入っていなければ「;」を入れたうえで同様にする。この作業はシステムの設定に関わる作業なので、慎重に行うように。
ペーストする文字列は「C:\tex\bin」。

「texinst2012.exe」というのが「tar.xz」と最後に付くファイルを実行ファイル形式にしてくれる(コンパイルしてくれる?)ものらしい。ここまで理解するのにかなりの時間がかかった、どういうこっちゃい。

2.サクラエディタ

http://sourceforge.net/projects/sakura-editor/files/sakura2/
サクラエディタのバイナリファイルはここにある。2.0.6以上のがいいらしい。

サクラエディタのマクロを作る

作る場所はWindows7だとここがいいだろう
C:\Users\(ユーザ名)\AppData\Roaming\sakura

マクロの内容はここ
http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?%E3%82%B5%E3%82%AF%E3%83%A9%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF
のマクロというところの「function main()」から始まるもののどれかをコピペしてテキストファイルに保存すればいい。

日本語を使いたいなら「pdfupLaTeX.js」などをコピペするとよい。

サクラエディタでマクロを使うには、設定→共通設定→マクロで、頑張っていじればなんとかなる。
キー割り当てもやっておくと便利である。分からなければGoogle先生に聞いてほしい。

サンプル例はWikipediaの具体例を参考にした。適当に日本語(2byte文字)を書いて、日本語環境のテストもしておくとよい。
http://ja.wikipedia.org/wiki/LaTeX

PDFを表示したいときは、Adobe ReaderのPathも通す必要がある。
セキュリティの無効化もする必要があるようだ。Adobe Readerは脆弱性を抱えていることが多いので、無効化したくないのだが、セキュリティと利便性は表裏一体なので仕方がない。

以上、サクラエディタ+LaTexの導入時のメモでした。

2013年3月22日金曜日

cv::GaussianBlur の使い方


cv::Mat src = cv::Mat::zeros(15,15,CV_16U);
src.at<ushort>(7,7) = cv::saturate_cast<ushort>(10000);
std::cout<<src<<std::endl;

cv::Mat src1 = cv::Mat::zeros(15,15,CV_16U);
src1.at<ushort>(7,7) = cv::saturate_cast<ushort>(10000);
cv::GaussianBlur(src1,src1,cv::Size(15,15),0.5,0,4);
std::cout<<"sigma = 0.5"<<std::endl<<src1<<std::endl;

cv::Mat src2 = cv::Mat::zeros(15,15,CV_16U);
src2.at<ushort>(7,7) = cv::saturate_cast<ushort>(10000);
cv::GaussianBlur(src2,src2,cv::Size(15,15),1.0,0,4);
std::cout<<"sigma = 1.0"<<std::endl<<src2<<std::endl;

cv::Mat src3 = cv::Mat::zeros(15,15,CV_16U);
src3.at<ushort>(7,7) = cv::saturate_cast<ushort>(10000);
cv::GaussianBlur(src3,src3,cv::Size(15,15),2.0,0,4);
std::cout<<"sigma = 2.0"<<std::endl<<src3<<std::endl;
http://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E9%96%A2%E6%95%B0
二次元のガウス関数をかける方法である。結果を下に記述する

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 10000, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
sigma = 0.5
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 113, 837, 113, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 2, 837, 6187, 837, 2, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 113, 837, 113, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
sigma = 1.0
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 2, 11, 18, 11, 2, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 2, 29, 131, 215, 131, 29, 2, 0, 0, 0, 0;
  0, 0, 0, 0, 11, 131, 585, 965, 585, 131, 11, 0, 0, 0, 0;
  0, 0, 0, 1, 18, 215, 965, 1592, 965, 215, 18, 1, 0, 0, 0;
  0, 0, 0, 0, 11, 131, 585, 965, 585, 131, 11, 0, 0, 0, 0;
  0, 0, 0, 0, 2, 29, 131, 215, 131, 29, 2, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 2, 11, 18, 11, 2, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
sigma = 2.0
[0, 0, 0, 0, 1, 1, 2, 2, 2, 1, 1, 0, 0, 0, 0;
  0, 0, 0, 1, 1, 3, 4, 4, 4, 3, 1, 1, 0, 0, 0;
  0, 0, 1, 2, 6, 11, 15, 17, 15, 11, 6, 2, 1, 0, 0;
  0, 1, 2, 7, 17, 33, 48, 54, 48, 33, 17, 7, 2, 1, 0;
  1, 1, 6, 17, 42, 78, 114, 129, 114, 78, 42, 17, 6, 1, 1;
  1, 3, 11, 33, 78, 146, 213, 241, 213, 146, 78, 33, 11, 3, 1;
  2, 4, 15, 48, 114, 213, 310, 351, 310, 213, 114, 48, 15, 4, 2;
  2, 4, 17, 54, 129, 241, 351, 398, 351, 241, 129, 54, 17, 4, 2;
  2, 4, 15, 48, 114, 213, 310, 351, 310, 213, 114, 48, 15, 4, 2;
  1, 3, 11, 33, 78, 146, 213, 241, 213, 146, 78, 33, 11, 3, 1;
  1, 1, 6, 17, 42, 78, 114, 129, 114, 78, 42, 17, 6, 1, 1;
  0, 1, 2, 7, 17, 33, 48, 54, 48, 33, 17, 7, 2, 1, 0;
  0, 0, 1, 2, 6, 11, 15, 17, 15, 11, 6, 2, 1, 0, 0;
  0, 0, 0, 1, 1, 3, 4, 4, 4, 3, 1, 1, 0, 0, 0;
  0, 0, 0, 0, 1, 1, 2, 2, 2, 1, 1, 0, 0, 0, 0]

ガウス関数型に分布しているのが分かるだろう。
半値半幅は1.17 × sigma になる。

2013年3月21日木曜日

cv::Matを初期化する方法


void Initialize()
{
// 要素がすべて 100 の width160, height100 の画像
Mat src1 = Mat::ones(100,160,CV_8U) * 100;
imshow("src1", src1);
waitKey(0);

// 要素がすべて 0 の width160, height100 の画像
Mat src2 = Mat::zeros(cv::Size(160,100), CV_8U);
imshow("src2", src2);
waitKey(0);

// 定数で初期化する1
Mat src3(100,160,CV_8U, cv::Scalar(100));
imshow("src3", src3);
waitKey(0);

// 定数で初期化する2
Mat src4(100,160,CV_8U, cv::Scalar(100));
src4 = cv::Scalar(100);
imshow("src4", src4);
waitKey(0);

// 定数で初期化する3
Mat src5 = Mat::ones(100,160,CV_8U);
src5 *= 100;
imshow("src5", src5);
waitKey(0);

// 定数で初期化する4
Mat src6 = Mat::zeros(100,160,CV_8U);
src6 += 100;
imshow("src6", src6);
waitKey(0);

// Cの配列で初期化する1
uchar data1[100*160];
for(int i=0;i<100*160;i++)
{
data1[i] = uchar(i%255);
}
Mat src7(100,160,CV_8U,data1);
CV_Assert(src7.refcount == NULL);
imshow("src7", src7);
waitKey(0);

// Cの配列で初期化する2
float data2[100*160];
for(int i=0;i<100*160;i++)
{
data2[i] = float((i%255)/255.0);
}
Mat src8(100,160,CV_32F,data2);
CV_Assert(src8.refcount == NULL);
imshow("src8", src8);
waitKey(0);
};

初期化する方法を8個記述した。

8bitの要素を持つモノクロの画像は、CV_8Uというtypeで表される。
32bit単精度浮動小数点数(float)の要素を持つモノクロ画像は、CV_32Fというtypeで表される。
画像の世界でよく使われるのは、1チャンネル(モノクロ)では以下のtypeが挙げられる。
uint8_t = unsigned char = CV_8U
uint16_t = unsigned short = CV_16U

cv::Matで作られたインスタンスは 「*=」や「+=」の演算子を使うことが可能である。
http://docs.opencv.org/modules/core/doc/basic_structures.html#matrixexpressions

Cの配列で初期化するときは、CV_Assertが必要らしい。

私が初めにつまづいたのは、最初の例の画像の幅(width)と高さ(height)の順番である。
私の知りうる多くの参考書には、width、heightの順に紹介されており、Matクラスもそうなっているものと思い込んでいた(頃があった)。Matクラスでwidthとheightをそれぞれ指定するときは、rows(行、高さ、height)、cols(列、幅、width)の順番で指定しなければならない。Matクラスは本来行・列のためのクラスなのだから、当然と言えば当然である。

ちなみに、2つ目の例にあるように、Sizeクラスを使って指定するときは、width方向(cols、列)、height方向(rows、行)の順である。後に出てくるPointクラスを使う時も同じである。注意してほしい。

2013年3月5日火曜日

OpenCV を Visual Studio で使う方法の解説

OpenCV を Visual Studio で使う方法
http://physics-station.blogspot.jp/2013/03/opencv-visual-studio.html
の解説です。最終更新:11月19日

OpenCVは非常に強力な画像処理ライブラリであり、一般的な画像処理はこのライブラリをつかえばほぼ実現できます。

いずれのライブラリにも言えることですが、導入が面倒であったり、日本語の解説サイトが少ない又は古いということがよくあります。OpenCVも導入編を解説したサイトの多くが、CMakeを使っていたり、インクルードファイルの設定が面倒だったりと、初心者にとっては辛いサイトが多い気がしていました。

なので、OpenCVの初心者でも間違いなく一発で導入できることを目標に、上の「OpenCV を Visual Studio で使う方法」を書きました(が、これでも難しい人もいるでしょう)。ここでは簡略化のために説明しきれなかった情報の補足をします。

OpenCVは執筆段階のver2.4.7で4つのプラットフォームに対応しています。また、言語もC、C++、Phytonなどに対応しています。ここでは、VC++を使う観点から、全てのコードにおいてC++のコードを使います。OpenCVでは、「cv」+大文字から始まるCの関数は使わず、名前空間cvと小文字から始まるC++の関数を使います。

opencv.orgで配布されているOpenCVのライブラリには、VC++ですぐに使えるダイナミックリンクライブラリ「.dll」が含まれています。以前はCMakeなど自分で「.dll」を作成しなければなりませんでしたが、今はその必要はありません。ただし、OpenNIやICCを使った「.dll」を作成するときなどは、CMakeで作成する方法は有効です。

2.ライブラリの展開

ライブラリの展開場所ですが、C:\以外でも構いません。この後の設定の内容を必要に応じて変えれば問題ありません。

3.静的リンクライブラリの設定

静的リンクライブラリの設定は、pragmaというプリプロセッサ命令で解決します。VCに直接指定することもできますし、毎回pragmaを書く方法もありますが、pragmaが書かれたファイルを作成し、そのファイルを使いまわすことが、最も簡単で説明しやすい方法だと思っています。

ここで、ファイル名の最後の方にある「247」は、opencvのバージョンによって違うので、バージョンが上がるたびに(筆者かあなたが)書き換える必要があります。バージョンによって梱包されている.libの名前が違うことがあるので、もし動かない場合はバージョン2.4.7を入れてみてください。

4.動的リンクライブラリの設定

動的リンクライブラリ(ダイナミックリンクライブラリ)はWindowsにPathを通す必要があります。

VS2008 32bitの場合
C:\opencv\build\x86\vc9\bin

VS2008 64bit の場合
C:\opencv\build\x64\vc10\bin

VS2010 or VS2012 32bit の場合
C:\opencv\build\x86\vc10\bin

VS2010 or VS2012 64bit の場合
C:\opencv\build\x64\vc10\bin

バージョン2.4.7ではVS2010とVS2012に対応しています。VS2008には対応しなくなったようです。

5.VisualStudioの設定

VisualStudioの設定については、いくつかの流儀があるように思います。Userファイルに設定する方法は、表からは見えない場所に各種設定をしてしまうため、再インストールしたときなどに行方不明になる可能性大です(というわけで、筆者はこの方法は使っていません)。プロジェクトを作るときに(面倒だけど)毎回能動的に設定する方法で記述しています。

ここまで設定してきたインクルードファイル、静的リンクライブラリ(ライブラリ)をVSに設定することになります。動的リンクライブラリはWindowsに設定したのでVSに設定する必要はありません。また、VSを起動した状態で動的リンクライブラリを設定したときは、VSを再起動する必要があります。

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

ここまでの作業が問題ないかを確認するための大事な作業です。プログラミングの業界ではおなじみのHello World!を画像上に描写しそれを表示するプログラムにしました。
解説は以上です。

最後に、OpenCV歴が短い筆者ではありますが、この強力なライブラリを一人でも多くの人が楽に使えることを願って、また拙筆かつ遅筆をご容赦いただければと思います。