OpenCV2.4.1が公開されました

2012.6.2 OpencV2.4.1が公開されました。

 

OpenCV2.4.1のWindows版の入手先はこちら

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.1/

 

OpenCV.2.4からOpenCV2.4.1への変更点はこちらを参照下さい。

http://code.opencv.org/projects/opencv/wiki/ChangeLog#241

日本語はこちらより

http://opencv.jp/opencv2-x-tips/changelog_from_240

 

今回の変更では、ライブラリの構成的には変更が無いので、インストール方法についてはOpenCV2.4のインストール方法を参考にlibファイルのファイル名の240の部分を241に読み替えて参考にして下さい。

 

ちなみに、今回はOpenCV2.4の公開から約1ヶ月という短い期間でOpenCV2.4.1の公開となった訳ですが、今後も約1ヶ月間ペースでのバージョンアップが予定されています。

バージョンアップの予定についてはロードマップとして公開さているので参考まで↓

http://code.opencv.org/projects/opencv/roadmap

 

テキストフォーマット除去ソフト【EraceTextFormat】

Webページなどをコピーして、ワードやメールなどに貼り付けると、文字の大きさやフォーマットも、そのまま反映されるため邪魔な場合があります。

 

そんなテキストのフォーマットを削除するソフトを作ってみました。

 

と言っても、コピーされたテキストを文字列へ入れ、クリップボードへ入れなおすだけの、全部で20行にも満たない簡単なソフトです。

ただ、自分が欲しかったもので...

 

ソフトのダウンロードはこちら

(別途、.NET Framework 2.0が必要です。)

 

使い方は、文字列をコピー(Ctrl+C)し、このソフト(EraceTextFormat.exe)を実行して、ワードなどに貼り付ける(Ctrl+V)と、文字列のフォーマットが削除され、文字列のみを貼り付けてくれます。

【C#】ユーザーコントロールに『親コンテナにドッキングする』を追加する

ピクチャボックスなどのコントロールでは、コントロールの右上に黒い三角のマークが表示され、この三角のマークをクリックすると「親コンテナにドッキングする」などを行う事ができます。

 

 

自作のユーザーコントロールには、この三角のマークが表示されず、親コンテナにドッキングするにはDockプロパティを Fill に設定していると思います。

 

しかし、PictureBoxなどで慣れ親しんでいるので、この三角マークを出したい!

という事で、調べてみましたが、意外と簡単。

 

クラスの属性に

 

[Docking(DockingBehavior.Ask)]

 

を追加するのみ。(クラス宣言の直前に記載して下さい。)

例えば、こんな感じ↓

namespace WindowsControlLibrary1
{
    [Docking(DockingBehavior.Ask)]
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
    }
}

これで、ユーザーコントロールにも親コンテナにドッキングするを追加する事ができます。

 

 

ちなみに、この黒の三角マークはスマートタグというそうです。

【C#】XMLドキュメントコメント

クラスやメソッドのコメントは以前は

//--------------------------------------------------------------- 
//【関数名 】:Test 
//【処理概要】:評価用の関数 
//【引数  】:Para1 = パラメータ1 
//      :Para2 = パラメータ2 
//      :Para3 = パラメータ3 
//【戻り値 】:エラー内容 
//【備考  】: 
//--------------------------------------------------------------- 
int Test(int Para1, float Para2, double Para3){

のような感じで書いていたのですが、.NET環境、特にC#においてはXML形式でコメントを書くことで、より応用が広がります。

 

と言っても、C#ではXMLの部分は自動で書いてくれるので、かなり便利です。

やり方は以下の通り。

 

まず、クラスやメソッド、フィールドのある程度の大枠(メソッドの場合は、少なくとも引数の部分)を書いておきます。

public int Test(int Para1, float Para2, double Para3) 
{ 
	return 0; 
}

次に、コメントを付けるクラスやメソッドなどのすぐ上の行で////を3個入力します。
すると、自動で以下のようなコメントが付いてくれます。

/// <summary>
/// 
/// </summary> 
/// <param name="Para1"></param> 
/// <param name="Para2"></param> 
/// <param name="Para3"></param> 
/// <returns></returns> 
public int Test(int Para1, float Para2, double Para3) 
{ 
    return 0; 
}

<summary>はクラスやメソッドなどの概要
<param>は引数の説明
<returns>は戻り値の説明
を表します。
他にも使えるタグがあるので、詳細は下記msdnを参照下さい。
http://msdn.microsoft.com/ja-jp/library/5ast78ax

 

このタグに挟まれた部分にそれそれの説明を下記のように記載します。

/// <summary>
/// Testメソッドの概要
/// </summary> 
/// <param name="Para1">Para1の説明</param> 
/// <param name="Para2">Para2の説明</param> 
/// <param name="Para3">Para3の説明</param> 
/// <returns></returns> 
public int Test(int Para1, float Para2, double Para3) 
{ 
    return 0; 
}

するとインテリセンスの表示の時に

 

 

のように、コメントに記載した部分がヒントで表示してくれます。

 

各引数の説明も、このように↓

 

 

表示しれくれます。

 

さらに、プロジェクトのプロパティでビルド→XMLドキュメントファイルの部分にチェックをいれ、XMLファイルを出力させる設定にすると、Sandcastleというようなヘルプファイル作成ソフトを使って、このXMLファイルを渡すとmsdnのようなヘルプファイルを作る事も可能になります。

 

他のVB.NETやC++/CLIでは、自動でXMLの部分を作ってくれないのですが、XMLの部分は同じ文法で書く事ができます。

 

やっぱC#ってすごい!

OpenCV2.4の入手、ダウンロード、インストール、環境設定

2013年3月現在、OpenCVの最新バージョンはVer.2.4.4です。
OpenCV2.4.4のダウンロードは下記ページより入手して下さい。

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.4/

 

また、インストール方法はlibファイルのxxx240.lib,xxx240d.libの部分をxxx244.lib,xxx244d.libに読み替えて下さい。

 

下記はVer.2.4.0の説明です。


 

2012.5.1 OpenCV2.4の正式版が公開されました。

 

OpenCV2.3.1からの変更点は下記リンク先よりご確認下さい。

 

http://code.opencv.org/projects/opencv/wiki/ChangeLog#New-functionality

 

日本語版は下記を参照下さい。

 

OpenCV2.3.1→OpenCV2.4betaへの変更点

http://opencv.jp/opencv2-x-tips/changelog_from_231

 

OpenCV2.4beta→OpenCV2.4への変更点

http://opencv.jp/opencv2-x-tips/changelog_from_24beta

 

インストール上で気になるポイントは

●SURFおよびSIFT処理の特許が申請されている処理アルゴリズムは別のモジュール(opencv_nonfree240.dll)へ移動

●OpenCVで使用している並列化ライブラリ(TBB)がOpenCVのパッケージに同梱
注)Release版のTBBのみ、Debug実行する場合は別途TBBを入手する必要があります。

ぐらいでしょうか。

 

以下、Windows版のインストール方法について記します。

 

OpenCV2.4の入手、ダウンロード先

OpenCVの入手は下記ページよりダウンロードして下さい。

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.0/

上記リンク先へ行き、OpenCV-2.4.0.exeをクリックしてファイルをダウンロードして下さい。

 

OpenCV2.4のインストール方法

ダウンロードしたファイル(OpenCV-2.4.0.exe)をダブルクリックすると、ファイルの解凍が始まるので、ここでは c:\ に解凍する事にします。(慣れている人はどこでも構いません。)
Extract to:の部分に c:\ と入力して下さい。

 

 

ファイルを解凍すると、主な構成は下記のようになっています。

 

c:\opencv
┣ 3rdparty
┣ android
┣ build
┃┣ common
┃┃ ┗tbb
┃┃      ┣ ia32
┃┃      ┗ intel64
┃┣ gpu
┃┣ include
┃┣ python
┃┣ x64
┃┃ ┣mingw
┃┃ ┣vc9
┃┃ ┗vc10
┃┗ x86
┃  ┣mingw
┃  ┣vc9
┃  ┗vc10
┃   ┣bin
┃   ┣lib
┃   ┗staticlib
┣ data
┣ doc
┣ include
┣ module
┗ samples

 

次にダウンロードしたdllファイルをPCから使えるようにPathの設定というのを行います。

 

Pathの設定はWindowsのスタートボタンをクリック → コンピュータ右クリックプ ロパティをクリックします。

 

 

開いたウィンドウの システムの詳細設定 をク リックします。

 

 

次に詳細設定タブの環境変数のボ タンをクリックします。

 

 

次にシステム環境変数のPathを選択し、編集をクリックします。

 

 

変数値のテキストボックスの最後の部分に、OpenCVのdllファイルのあるフォルダを指定します。

 

また、別途OpenCVからTBBというライブラリも使用するので、この2つのPathを設定します。

 

32bitプログラムでVisualStudio2010を使用する場合は

 

;C:\opencv\build\x86\vc10\bin;C:\opencv\build\common\tbb\ia32\vc10

 

※もともとあった文字は消さないようにご注意ください。
最初の ; (セミコロン)を付けるのもお忘れなく。
PATHの設定後、PCを再起動して下さい。(ログオフ⇒ログインでも可)

 

別の環境にOpenCVをインストールする場合は下記の表を参考に
使用する環境に合わせてディレクトリを指定して下さい。

 

32bit、Visual Studio2008の場合 ;C:\opencv\build\x86\vc9\bin;C:\opencv\build\common\tbb\ia32\vc9
32bit、Visual Studio2010の場合 C:\opencv\build\x86\vc10\bin;C:\opencv\build\common\tbb\ia32\vc10
64bit、Visual Studio2008の場合 C:\opencv\build\x64\vc9\bin;C:\opencv\build\common\tbb\intel64\vc9
64bit、Visual Studio2010の場合 C:\opencv\build\x64\vc10\bin;C:\opencv\build\common\tbb\intel64\vc10

 

ただし、同梱されているTBBはRelease版のみのため、Debug実行すると

 

コンピュータにtbb_debug.dllが無いため・・・

 

と表示されてしまします。

Debug実行も行う場合は、別途TBBをこちら

http://threadingbuildingblocks.org/file.php?fid=77

 

のページの最新版をクリックし、Windowsの場合は tbb×××_win.zipのファイルをダウンロードし、解凍したdllファイルを上記で指定したフォルダの中へコピーして下さい。

 

64bitOSを使っていても32bitでプログラムする場合は x86 フォルダ内のbinディレクトリを指定して下さい。
64bitを使う場合は、VisualStudioのプラットフォームをx64にして下さい。

(Visual Studioの上の方(メニューの下)に表示されているWin32の部分をx64にして下さい。)

 

なんだか良く分からない場合は、OSが64bitであっても、32bit版のOpenCVを使った方がハマりにくいと思います。

 

VisualStudio2010での使用方法

使用するのはVisualStudio C++ 2010 Express以上のエディションで大丈夫です。

 

VisualStudio2010を起動し、新しいプロジェクトをクリックし、左側のメニューのWin32を選択した状態でWin32コンソールアプリケーションをクリックします。

 

適当な名前を付け、保存する場所を指定し、OKボタンをクリックします。

 

すると下記のようなソースコードが表示されます。

// OpenCV2.4Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}

 

次にOpenCVのヘッダファイルが、今回作成したプロジェクトから参照できるように設定を行います。

 

プロジェクトの名前の部分を右クリックし、メニューのプロパティを選択します。

 

表示されたウィンドウ左上の構成を全ての構成にし、構成のプロパティ⇒C/C++⇒全般を選択して、OpenCV2のフォルダのあるディレクトリ(C:\opencv\build\include)を追加のインクルードディレクトリに指定します。

 

 

以上の設定を行い、ソース部分を下記のようにすると、ガウシアンフィルタ処理を行う簡単なサンプルプログラムが実行できると思います。

// OpenCV2.4Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// opencv2のあるフォルダ『C:\OpenCV\include』などを追加のこと
#include "opencv2\opencv.hpp"

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video240d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video240.lib")
#endif

int _tmain(int argc, _TCHAR* argv[])
{

    //画像データの読込
    IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
    if (src_img == NULL){
        return 0;
    }

    //表示ウィンドウの作成
    cvNamedWindow("src");
    cvNamedWindow("dst");

    //処理後画像データの確保
    IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels);

    //画像処理例(ガウシアンフィルタ)
    cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9);

    //画像の表示
    cvShowImage ("src", src_img);
    cvShowImage ("dst", dst_img);

    //キー入力待ち
    cvWaitKey (0);

    //全てのウィンドウの削除
    cvDestroyAllWindows();

    //画像データの解放
    cvReleaseImage(&src_img);
    cvReleaseImage(&dst_img);

    return 0;
}

上記サンプルは32bitでVisualStudio2010で開発する場合の設定です。
環境が異なる場合は #pragma comment の部分のパスを環境に合わせて変更して下さい。

 

ちなみに、libファイルは全て必要ではなく、おおむね

 

opencv_core240、opencv_imgproc240、opencv_highgui240、opencv_objdetect240

 

の4種類ぐらいである程度動作すると思います。(使用する関数によって必要なlibファイルが決まります。)

 

SIFTもしくはSURFを使用する場合は、別途、

 

Releaseの場合:opencv_nonfree240.lib

Debugの場合  :opencv_nonfree240d.lib

 

が必要となります。

 

また、libファイルのファイル名に含まれる数字部分がOpenCVのバージョンを示し、ファイル名の最後についているdの文字がDebug用のlibファイル、dの無いファイルがRelease用のlibファイルとなっています。

 

その他

VisualStudio2005でOpenCV2.4を使用する場合は自分でOpenCV2.4をコンパイルするか、
VisualStudio2008用のライブラリを使用する場合は
Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)
VisualStudio2010用のライブラリを使用する場合は
Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86)

 

が必要となります。ただし、VisualStudio2005からはReleaseモードのみ実行可能なので、Debugモードでも実行したい場合はExpress Editionでも構わないのでVisualStudioをインストールすると実行可能です。

 

OpenCV2.4でCMakeを使って自分でOpenCVをコンパイルする場合は、OpenCV2.3の場合の説明ですが、下記ページを参照下さい。

 

https://imagingsolution.net/program/opencv/opencv2-3/opencv2-3-downlaod-install/#compile-opencv

 

基本的にOpenCVなどのライブラリを使う場合は、ライブラリの3点セット(*.dll、*.lib、*.h)をいかに使うか?がポイントになります。

 

余裕のある方は下記ページも参考にしてみて下さい。

 

ライブラリの使用方法、VisualStudioの設定方法

 

トラブルシューティング

●「コンピュータにopencv_core240d.dllがないため、プログラムを開始できません。・・・」と表示される。

 

 

このエラーメッセージはdllの参照設定が正しくできていない可能性があります。
Pathの設定を確認し、設定したらPCの再起動をしてみて下さい。
コンピュータにtbb_debug.dllが無いため・・・と表示されている場合はTBBのライブラリ(*.dll)のdebug版のファイルを入手し、指定したPathへdllファイルが入っているか?Pathの設定が正しいか?deご確認下さい。

 

error LNK2019: 未解決の外部シンボル・・・と表示される。

この未解決のシンボルのエラーの場合、libファイルの設定が不足している場合が考えられます。

 

libファイルの参照設定が正しいか?(本記事では、ソースコード中に記載した#pragma commentの部分)をご確認下さい。

 

fatal error C1083: include ファイルを開けません。と表示される。

ヘッダファイルの参照設定が正しくない可能性があります。

 

プロジェクトのプロパティで構成のプロパティC/C++全般を選択して、OpenCV2のフォルダのあるディレクトリ(C:\opencv\build\include)を追加のインクルードディレクトリに指定しているか?ご確認下さい。※includeというフォルダが2か所あるのでご注意下さい。

 

Visual Studio Expressで64bit対応するには?

Expressでは標準的には64bitプログラムを作成することはできないようです。
ただし、SDKインストールすることで可能という情報もあるので、試してみては如何でしょうか?

方法 : Visual C++ プロジェクトを 64 ビット プラットフォーム用に設定する

 

OpenCVへ戻る

【参考書籍】〔速攻入門〕 C#プログラミング すぐに現場で使える知識

最近はC#を基礎から勉強しようと思い、わんくま同盟でも活躍されている著者の面々にあこがれて買ったこの本。
サブタイトルの「JavaかC++の知識があれば、いっそう有利な最短ルート」とあるように、この本はC++やJavaと比較しながら説明されています。

 

とくに良かった点は、「C#の××はC++では○○に相当しますが、△△な点が異なります。」というような表現は多かった事。
知りたかったポイントや、知らなくてちょっとヒヤっとした点など、簡素にまとまっています。

 

C#は過去に何かしらのプログラムをやった事があって、.NETの名前空間に慣れれば何となくプログラムできてしまいますが、逆に過去の知識が邪魔をして陥り易いミスもあると思います。

 

そんなC#をある程度やって、初級から中級、上級をめざす方にお勧めな本だと思います。
逆にまったくC#が初めてだと、ちょっと難しく感じると思います。

 

 

目次

Part 1 C#の文法 速攻入門
Chapter 1 C#とは?
1.1 C#の特徴
1.2 .NET Framework
Chapter 2 プログラム構造
2.1 基本的な構文―Hello World
2.2 コメント
2.3 名前空間
2.4 型―名前空間に属するメンバー
2.5 Mainメソッド
Chapter 3 手続きの記述
3.1 式の概要
3.2 ステートメントの概要
3.3 変数の宣言
3.4 演算子
3.5 制御構文
3.6 オーバーフローのチェック
3.7 例外処理
3.8 usingステートメント
3.9 型情報
3.10 既定値
3.11 lockステートメント
3.12 ラムダ式
3.13 クエリ式
Chapter 4 型
4.1 値型と参照型の違い
4.2 組み込み型
4.3 ジェネリック
Chapter 5 クラス
5.1 クラスの定義
5.2 アクセシビリティ
5.3 クラスのメンバー
5.4 静的メンバー
5.5 継承
5.6 クラスの分割定義
5.7 外部メソッド
5.8 匿名クラス
Chapter 6 インターフェイス
6.1 インターフェイスの定義
6.2 インターフェイスの実装
Chapter 7 構造体
7.1 構造体の定義
7.2 クラスあるいは構造体の選択
Chapter 8 列挙型
8.1 列挙型の定義
8.2 列挙型の利用
8.3 ビットフラグ
8.4 拡張メソッドの利用
Chapter 9 デリゲート
9.1 デリゲートの定義
9.2 デリゲートの利用
9.3 匿名関数
Chapter 10 配列
10.1 配列の利用
10.2 多次元配列
10.3 System.Array型
10.4 配列の共変性
Chapter 11 Null許容型
11.1 Null許容型の利用
11.2 Nullable構造体
11.3 型変換
11.4 演算子
Chapter 12 属性
12.1 属性の例
12.2 属性の定義
12.3 属性の適用
12.4 属性値の実行時取得
12.5 C#コンパイラが使用する属性
12.6 相互運用のための属性
Chapter 13 安全でないコード
13.1 ポインターとは?
13.2 「安全でないコード」の注意点
13.3 unsafeコンテキスト
13.4 ポインター型
13.5 sizeof演算子の利用
13.6 アドレスの固定化
13.7 スタックの割り当て
13.8 固定サイズバッファーの埋め込み
Part 2 C#のポイント 速攻入門
Chapter 1 ジェネリック
1.1 ジェネリックの利用方法
1.2 内部的な方式の比較
1.3 実装方式の比較
1.4 メンバー参照
1.5 強い型付け
Chapter 2 定数と読み取り専用
2.1 バージョニング問題
2.2 フィールドの再代入禁止とオブジェクトの不変性
2.3 引数の既定値
Chapter 3 例外処理
3.1 例外の利用場面
3.2 try-catchとtry-finally
Chapter 4 リソース管理
4.1 ガベージコレクション
4.2 デストラクター
Chapter 5 イベント駆動
5.1 イベント構文
5.2 イベントとメモリリーク
Chapter 6 暗黙的な型指定
6.1 冗長性の排除
6.2 オーバーロードとジェネリック
6.3 varと匿名型
Chapter 7 データ処理
7.1 反復子構文
7.2 反復子構文を使ったデータの加工
7.3 LINQ
Part 3 C#活用 速攻入門
Chapter 1 ファイルの読み書き
1.1 サンプルの内容
1.2 LINQを使ったCSVファイルの読み書き
1.3 ReadLinesの内部挙動
1.4 LINQを使わない例
1.5 ファイルの読み書きに関係するその他のクラス
Chapter 2 GUI
2.1 簡単なGUIアプリケーションの例
2.2 GUIと非同期処理
2.3 視覚的デザインツールの利用
2.4 ビューの分離
Chapter 3 Webアクセス
3.1 Webページの表示
3.2 Webアクセスのためのクラス
3.3 Webサービスの利用
3.4 Webアクセスに関係するその他のクラス
Chapter 4 Win32 APIとCOMの扱い
4.1 単純なP/Invokeの例
4.2 文字列を受け渡しするP/Invoke
4.3 文字列を渡す場合のその他の方法
4.4 構造体を利用したP/Invoke
4.5 COMのやり取り
4.6 MS Officeなどとのやり取り
Chapter 5 データベースアクセス
5.1 一番シンプルなADO.NET
5.2 ExecuteReaderとMARS
5.3 DataSetを使ったデータアクセス方法
5.4 DataSetなどで隠蔽されたデータの行方
5.5 DataSetを使ってデータの絞り込みを行う方法
5.6 DataSetを使ったデータの更新削除
5.7 LINQ to SQLを使ってデータの絞り込みを行う方法
5.8 LINQ to SQLを使った更新方法
5.9 LINQ to SQLのその他の違い
5.10 LINQ to SQLのSELECTでストアドプロシージャを使う方法
5.11 Entity Frameworkを利用したデータアクセス
5.12 Entity FrameworkのSELECTでストアドプロシージャを使う方法
5.13 どの技術を使うのが良いのか?
Chapter 6 並列処理
6.1 Threadクラスを利用する方法
6.2 同期化の方法
6.3 プロセスをまたいだ排他処理
6.4 スレッドセーフなコレクション
6.5 デリゲートを利用する方法
6.6 BackgroundWorkerを利用する方法
6.7 Taskを利用する方法
6.8 Parallel.For,Parallel.ForEachを利用する方法
6.9 Parallel LINQを利用する方法
Chapter 7 実行時コード生成
7.1 静的なコード
7.2 リフレクション
7.3 動的に生成したコードのキャッシュ

 

 

OpenCV-2.4.0-GPU-demos-packが公開

OpenCV2.4Betaの公開に引き続き、GPU(CUDA4.1)を使ったOpenCV処理のデモソフト(OpenCV-2.4.0-GPU-demos-pack)が公開されました。

 

入手先はこちら

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.0/

 

このデモを動かすにはCUDA4.1が必要で、インストールされていない場合は、こちら↓

http://developer.nvidia.com/cuda-toolkit-41

 

のサイトの少し下の部分 Developer Drivers Downloads より環境に合わせたドライバをダウンロード、インストールする事で、OpenCV-2.4.0-GPU-demos-packが動作可能となります。

OpenCV2.4Betaが公開されました。

2012.5.1 OpenCV2.4の正式版となりました。
2012.4.13 OpenCV2.4Beta2となりました。
2012.4.3 0:30頃? OpenCV2.4Betaが公開されました。

OpenCV2.4Betaの入手先は

 

【Windowsの場合】

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.0/

【Unixの場合】

http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.0/

 

今回の変更内容はこちら

http://code.opencv.org/projects/opencv/wiki/ChangeLog#New-functionality

 

【マニュアル類】
●リファレンスマニュアル(http://opencv.itseez.com/opencv2refman.pdf)
●ユーザーガイド(http://opencv.itseez.com/opencv_user.pdf)
●チュートリアル(http://opencv.itseez.com/opencv_tutorials.pdf)

 

Cannyやfindcontourがカラーに対応したとのこと。

findcontourの例↓

findcontourの場合はカラーで二値化した場合の事らしい。

Cannyのカラー対応って?と思ったら、処理結果はモノクロで出力されます。

 

まだ、詳細を見ていませんが、今回は新しい構成にopencv_nonfree、opencv_photo、opencv_videostabなる物が追加されています。

 

opencv_nonfreeには特許の取られている処理アルゴリズムのSIFTとSURFがこちらの構成に入れられたので、必要ない時はこのdllを使わなければいいので、特許の心配は無くなりました?って言っていいのだろうか?他にも無いか?ちょっと心配...

 

必要なモジュールはCMakeの時に選択できるようになりました。

 

 

過去の例で言うと、Betaと付いた場合は比較的早く新しいバージョンが公開されるので、人柱になるつもりが無ければ今のところは使わなくていいと思います。

 

今回のOpencV2.4Betaでは、サンプル画像の中に基盤の絵があったり、何やら工業用途で使えるようになるような期待感が...

 

評価中メモ

※メモなので、下記内容に信憑性はありません。



●GPU処理はCUDA4.1が必要


●cv::imread(ファイル名)で画像が読み込めない。(cv::Matにデータが入らない)
とりあえず、こんな感じ↓で回避中
cv::Ptr src = cvLoadImage(“Lenna.bmp”, ・・・・・・
cv::Mat img(src);


●cv::namedWindowのタイトルの文字が文字化けする


●カメラ制御用のenumが増えている。しかもちゃんと使えるっぽい。これでOpenCVからカメラの制御ができるかも?
CV_CAP_PROP_ZOOM =27,
CV_CAP_PROP_FOCUS =28,
CV_CAP_PROP_GUID =29,
CV_CAP_PROP_ISO_SPEED =30,
CV_CAP_PROP_MAX_DC1394 =31,
CV_CAP_PROP_BACKLIGHT =32,
CV_CAP_PROP_PAN =33,
CV_CAP_PROP_TILT =34,
CV_CAP_PROP_ROLL =35,
CV_CAP_PROP_IRIS =36,
CV_CAP_PROP_SETTINGS =37,

Kinect for Windowsとfor XBOX360の比較

KinectをWindows PCで使うのが正式に許されたKinect for Windowsですが、目玉は

 

●商用利用が可能

●Nearモードの対応

 

ですが、実際に使ってみた比較をまとめてみたいと思います。

 

仕様についての比較はUnaNancyOwenさんのまとめ?ブログが詳しいので、そちらを参照下さい。

 

まず、Kinect for Windowsの特徴Nearモードですが、センサーから40cmまでプレーヤーを認識してくれるというモードで、このよう↓にモニタの上に配置して比較してみました。

 

 

この配置で机に座ると、センサから顔までの距離が約40cmm

 

最初はNearモードは近い距離でも測定できるように広角撮影をしてくれるのか?と思っていましたが、見え方はDefaultモードでも同じで、測定可能範囲がNearモードで、400~3000mm、Defaultモードで800~4000mmになります。
(別のドライバを使っていた時は400mm~でDepthデータは拾えていたので、XBOX360そのものは400mmからの測定能力を持っていると思うのだが...)

 

ただし、プレーヤーを認識するまでには、一度、約120cmぐらい離れないと認識してくれません。

 

また、通常のモードではプレーヤーのスケルトン(関節の位置)も認識してくれますが、Nearモードではユーザーの中心(おそらくプレーヤー領域の重心)のみ1点の認識となります。

 

これについては次期SDKのバージョン1.5で改善されるようです。

(参考)

http://blogs.msdn.com/b/kinectforwindows/archive/2012/03/26/what-s-ahead-a-sneak-peek.aspx

 

深度データそのものに関してはNearモードもDefaultモードも変わらず、表示方法が変わるだけのようです。

 

実際に撮影した様子はこちら↓

■Kinect for Windowsで撮影(Nearモードで撮影しています。)

 

Kinect for XBOX360で撮影

 

まず、気になるのがカラー画像の画質の違い。

Kinect for Windowsでは全体的に霧がかかったようで、少し暗くてボケた感じ。

Kinect for XBOX360の方がキレイな感じがします。

 

そこで、Kinect本体をよーく見てみると、カラーカメラそのものが別物でした。

Kinect for Windowsカメラ Kinect for XBOX360カメラ

 

Kinect for Windowsにはピンホールカメラっぽい物が付いています。

 

また、細かい部分ですが、Kinect for Windowsでは台座を左右に回す事が出来ます。(マニュアルで)

 

 

と言う事で、Kinectが商用利用できるという事はインパクトが大きいのですが、今のところは無理してKinect for Windowsを買う必要は無かったかも?

 

次のバージョンのSDKでどれだけ関節の位置を認識してくれるか?によって、使い方も広がっていくと思われます。

 

※注意点(私がハマった事)
Kinect for Windowsセンサーの箱の底にも書いてありますが、センサをPCに接続する時はUSB2.0のバスを占有するように接続して下さい。
例えば、DualでKinectを接続したい場合やUSBカメラと同時に接続したい場合など、近い場所のUSBポートに接続すると何かしらのデバイスが認識しなくなる場合があります。
その場合はUSBポートを遠い場所(全面と背面とか)やUSBコネクタを抜差ししてみるなど、してみて下さい。

 

ちなみに、今回はモニタの上にそ~っとKinectを置いてみましたが、専用のマウントホルダーなる物も販売されていました。

 

 

後日、マウントホルダーを購入しました。

 

これを使うと机周りもスッキリしてオススメです!

 

【参考書籍】KINECT for Windows SDK プログラミング C#編

2012年2月の初旬に公開されたKinect for WindowsのSDKですが、もうすでにこのSDKの書籍が発刊されました。

 

著者はKinect + OpenNIの本(KINECTセンサープログラミング)を書いた中村薫さんほか。

仕事が早い!!!

 

 

Kinect for Windos SDKにはC++とC#のサンプルがあるのですが、今回はそのC#版について。

 

C#版のSDKは良く出来ていて、カラー画像、深度データ、スケルトンがそれぞれイベントで取得できるので、非常に簡単にデータが取得できます。

この本ではKinectの概要からインストール方法、応用へと、この一冊でほぼ網羅されているのではないでしょうか?

サンプルプログラムもVisual C# 2010 Express版で公開されているので、役にたつと思います。

どこでもタッチスクリーンというサンプルも面白そう。

 

ただ、WPFをやった事の無い私にとって、その部分がちょっと引っかかるのですが、ソースを見た限りだと、そんなにも難しくないかも?

と思っていたら、ちゃんとWPFを使わないFormを使った説明もありました。

 

このFormを使った方法については、私も以前、作った事があるので、下記のページ

 

Kinect for Windows SDK C#サンプルプログラム

 

も参考にして頂けると幸いです。

(深度データをBitmapへ渡す部分が本のサンプルとちょっと違います。)

 

また、OpenCVやOpenGLを使った例が載っていますが、それぞれ.NETのラッパーライブラリを使ったものなので、少しは簡単?だと思われます。(まだ未評価なもので。)

 

目次

1.導入

1.1 Kinectの概要
1.2 ライセンス
1.3 セットアップ
1.4 プロジェクトの作成

2.基本機能

2.1 Kinect for Windowsの概要
2.2 RGBカメラ
2.3 距離カメラ
2.4 プレイヤーの認識
2.5 スケルトンの認識
2.6 WindowsFormsを利用した実装
2.7 音声の取得
2.8 延元後方の取得
2.9 チルトモーター
2.10 Kinectの挿抜検出
2.11 ここまでの全プログラム

3.応用編

3.1 OpenCVを利用した顔認識
3.2 身長を測る
3.3 どこでもタッチスクリーン
3.4 背景マスク
3.5 光学迷彩
3.6 ポーズを認識する
3.7 ロボットを操作する
3.8 Kinectをマウス代わりにする
3.9 音声を認識する
3.10 音源方向のプレイヤーを特定する
3.11 OpenGLを利用した点群の表示

4.便利なライブラリ

4.1 Coding4Fun Kiect Toolkit
4.2 Kinect Toolbox

5.APIリファレンス

5.1 Kinect制御関連APIリファレンス
5.2 RGBカメラ関連APIリファレンス
5.3 距離カメラ関連APIリファレンス
5.4 骨格関連APIリファレンス
5.5 音声関連APIリファレンス

6.ユーザビリティ

6.1 ユーザビリティとは
6.2 良いデザイン
6.3 NUI(ナチュラルユーザーインターフェース)
6.4 Kinectを利用したインターフェース
6.5 最後に

補遺
A StreamingWavePlayer
B SendInput

 

【参考書籍】C#.NETアプリケーション開発 徹底攻略 C#3.0/.NET Framework3.5対応

この本はたまたま本屋で見つけた本なのですが、よくあるTipsやリファレンス系の参考書籍とは違い、実際のプログラムでどのようにすべきか?みたいな事が書かれています。

 

.NETのプログラムをしていると、結果は同じ様になる事でも幾つかのメソッドが用意されているため、これで本当にいいのか?.NETを使っていると処理が遅くないか?ガーベージコレクションはどうなってるのか?というようなモヤモヤ感が残る場合があります

これらの事が理論的に書かれているので、とても参考になりました。

 

あまり初心者向けな本ではありませんが、C#である程度プログラムできるようになった人が、読むと良いと思います。

 

 

目次

Chapter 01 導入:.NET Frameworkと開発環境

1.1 本書の目的

1.2 対象とする読者

1.3 本書の構成

1.4 .NET Framework概要

1.5 .NET Frameworkの現在

1.6 開発環境

1.7 コードサポート

Chapter 02 .NET Frameworkアプリケーション設計

2.1 設計概要

2.2 イベント/デリゲートをベースとしたイベント駆動型設計

2.3 型セーフな設計

2.4 Windows Formsアプリケーション設計

2.5 マルチスレッド/非同期制御

2.6 例外設計

2.7 データ型

2.8 リフレクション

2.9 ネイティブアプリケーション層の利用

Chapter 03 チューニング

3.1 .NET Frameworkの性能

3.2 チューニングポイント

3.3 メモリー管理/メモリチューニング

3.4 パフォーマンスプロファイリング

3.5 最初の.NET Frameworkチューニング

Chapter 04 リリース管理/セキュリティ

4.1 .NET Frameworkの実行環境

4.2 ClickOnce

4.3 ソースコードの保護

Chapter 05 COMアプリケーション連携

5.1 .NET FrameworkとCOM

5.2 レジストリ登録不要なCOM

5.3 .NET Frameworkを使用したCOMコンポーネント

Chapter 06 新しい.NET Framework/Silverlight

6.1 最新の.NET Framework

6.2 C# 3.0

6.3 Silverlight

6.4 Silverlightアプリケーションの作成

 

 

Kinect for Windows SDK C#サンプルプログラム

先日公開されたKinect for Windowsと、そのSDKですが、これまでKinectは研究用途で黙認状態でしたが、このKinect for Windows(Kinect本体)を使う事で商用が可能となるインパクトは大きく、これからもKinectを使ったアプリもどんどん出て来ると思います。

 

しかし、SDKはC#版とC++とがあり、C#なら簡単に出来るかな~?!と思ってもKinect for WindowsのSDKではC#とWPFを使うので、WPFをやった事がないと少し分かりづらいと思います。

 

そんなWPFなんて分からない!という人(私)向けにC#だけサンプルプログラムを作ってみました。

 

基本はC#+WPFのKinect Explorerのサンプルをベースにして、分かり易さ重視?!で音声部分や必要の無さそうな部分は削除しました。(エラー処理もあまり考えていません...)

 

作成したプログラムはこんな感じ↓

 

サンプルプログラムはこちら↓よりダウンロードして下さい。

Kinect for Windows SDK C#サンプル (Visual Studio 2010 C#)

 

このサンプルを実行するには別途、Kinect for WindowsのSDKをインストールしておく必要があります。

SDKはこちら↓のページよりダウンロード可能です。

http://www.microsoft.com/en-us/kinectforwindows/develop/overview.aspx

 

インストール方法については、他の人のページですが、このへん↓

 

Kinect3 -Kinect for Windows SDK

 

を参考にしてみて下さい。

 

ちなみに、このサンプルプログラムを作るのには、Kinect for Windows SDKのヘルプファイルのHow Tosの部分がともて参考になりました。

 

英語ですが一度、目を通して見てみて下さい。

 

OpenCVをスタティックリンクライブラリでビルドする方法

スタティックリンクライブラリを使うと他のPCへ作成した実行ファイルを移植する時にexeファイルをコピーすればOpenCVをインストールする事なく実行できるので、メリットはあるので、使ってみたいのですが、これが、なかなか分かりづらい。

 

OpenCV2.3.1ではファイル(OpenCV-2.3.1-win-superpack.exe)をダウンロードし、解凍するとスタティックリンクライブラリらしきフォルダ(staticlib)があるのですが、*.libファイルが不足しているらしく、未解決のシンボルのエラーが出て使う事が出来なさそうです。

 

そのため、OpenCV-2.3.1-win-superpack.exeのソースからCMakeを使ってスタティックリンクライブラリをビルドしてみました。

 

CMakeでビルドする方法はOpenCV2.3の入手、ダウンロード、インストール、環境設定のページを参考にして頂きたいのですが、上記のページから異なるポイントを示したいと思います。

 

今回OpenCV-2.3.1-win-superpack.exeを c:\ に解凍している事を想定しています。

 

まずCMakeで作成するプロジェクトの保存先のフォルダを作成しておきます。

 

今回は C:\opencv\userbuild というフォルダを作成するとします。

 

CMakeを起動し

 

Where is the source codeに C:/opencv

Where is the source codeに C:/opencv/userbuid

 

を指定します。

 

 

次にConfigureボタンをクリックします。

すると下図のようなウィンドウが開くので、使用するVisual Studioのバージョンを選択します。

 

 

Finishボタンをクリックすると下図のように表示されるので、BUILD_SHARED_LIBSのチェックを外します。CUDAに対応していないPCの場合はWHITH_CUDAのチェックも外して下さい。

 

 

次にConfigureボタンをクリックするとBUILD_WITH_STATIC_CRTという項目が表示されるので、チェックを入れたまま、Configureボタンをクリックします。

 

 

すると赤く表示された部分が無くなるので、Generateボタンをクリックします。

 

 

するとWhere is the source codeで指定したフォルダ(\userbuild)にソリューションファイル(OpenCV.sln)が作成されるので、このファイルをダブルクリックし、VisualStudioを開きます。

 

開いたVisualStudioのメニューからビルド→構成マネージャーを選択します。

 

次にINSTALLの項目にあるビルドの部分にチェックを入れます。

左上のアクティブソリューション構成の部分のDebugReleaseを選択しそれぞれにチェックを入れます。

 

この状態で、Visual Studioのメニューのビルド→ソリューションのビルドを選択し、OpenCVをビルドします。このビルドには、かなり時間がかかりますが、ReleaseDebugの両方でビルドを行って下さい。

 

これでWhere is the source codeで指定したフォルダ(\userbuild)内に必要なヘッダファイルとライブラリファイルが作成されます。

 

スタティックリンクライブラリを使用する方法

まず、Visual Studioを起動し、ファイル⇒新規作成と選択し、Visual C++⇒Win32内のWin32コンソールアプリケーションを選択し、ウィンドウの下の方にある名前をプロジェクトを作成する場所を指定します。

 

次に表示されたウィンドウで完了をクリックするとスケルトンプログラムが作成されます。

 

次にVisual Studioのメニューのプロジェクト⇒(プロジェクト名)のプロパティを選択し、構成のプロパティ⇒C/C++⇒全般と選択し、追加のインクルードディレクトリの部分に先程作成したOpenCVのopencv2のあるフォルダを指定します。(右上の構成の部分でDebugとReleaseを切り替えて同じ設定をして下さい。)

C:\opencv\userbuild\install\include

 

同じウィンドウで構成のプロパティ⇒リンカー⇒入力と選択し特性の指定のライブラリの無視の部分で

 

(Debugの場合)

LIBCMTD.lib;msvcprtd.lib

(Releaseの場合)

LIBCMT.lib;msvcprt.lib

 

を指定します。

 

これで、ソースコード上に下記のようにヘッダファイル(*.hpp)とライブラリファイル(*.lib)の設定を行うと、OpenCVをスタティックリンクライブラリとして使用する事が可能になります。

 

下記はWebカメラを撮影する簡単なコードです。

 

// OpenCVStaticSample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

//*******************************************************************************
// プロジェクトの設定
// ①プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
//      C:\opencv\userbuild\install\include
//   を追加
// ②プロジェクトのプロパティ⇒リンカー⇒入力 の特定の規定のライブラリの無視に
//    Debugのとき
//        LIBCMTD.lib;msvcprtd.lib
//    Releaseのとき
//        LIBCMT.lib;msvcprt.lib
//    を追加
//*******************************************************************************

#include "opencv2\\opencv.hpp"

#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"vfw32.lib")	// Video for Windows

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_core231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_imgproc231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_highgui231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_objdetect231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_contrib231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_features2d231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_flann231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_gpu231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_legacy231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_ts231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_video231d.lib")

    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\zlibd.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libtiffd.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libpngd.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjpegd.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjasperd.lib")

#else
    //Releaseモードの場合
	#pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_core231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_imgproc231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_highgui231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_objdetect231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_contrib231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_features2d231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_flann231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_gpu231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_legacy231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_ts231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_video231.lib")

    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\zlib.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libtiff.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libpng.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjpeg.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjasper.lib")

#endif

int _tmain(int argc, _TCHAR* argv[])
{

	// カメラオープン
	cv::VideoCapture cap(0);

	// カメラがオープンできたかの確認
	if(!cap.isOpened()) return -1;

	cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
	while(1) {
		cv::Mat frame;
		cap >> frame;  // キャプチャ
		// 様々な処理
		// ...
		cv::imshow("Capture", frame); // 表示
		if(cv::waitKey(30) >= 0)
		{
			cv::imwrite("cap.png", frame);
			break;
		}
	}

	return 0;
}

※実際に開発したPCとは別のPCへ実行ファイル(*.exe)を移植する場合、別途、C++のランタイムが必要となります。

 

移植先のPCに開発したPCで使用したVisual Studioと同じバージョンがインストールされていない場合、C++の再頒布パッケージというものをインストールします。

 

Visual Studio 2010 C++(32bit)の場合、以下の場所よりダウンロードして下さい。

Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86)

 

これで、OpenCVをスタティックリンクライブラリで使えていると思うのですが、この特定のライブラリの無視する部分と、comctl32.libとvfw32.libを追加しないといけない部分が分かりづらかった...

ただ、warning LNK4049のワーニングが幾つか出てしまい、いまいち、このwarningの消し方は分かりませんでした...

 

OpenCVへ戻る

 

C#(.NET)からOpenCVを使う方法、OpenCvSharpのインストール方法

OpenCVはシンプルな画像表示用のウィンドウも用意されているので、簡単に画像処理を試したい場合には非常に良いのですが、少し凝ったウィンドウを作成しようとすると、やっぱり.NETからOpenCVを触りたくなります。

 

.NETの言語(VB.NET、C#、C++/CLI)からOpenCVを使う方法は、だいたい以下の通り

  • .NETのラッパーライブラリを使う
  • 自作でラッパーライブラリを作成する
  • C++/CLIから直接使う

となりますが、実質的にはOpenCvSharpを使う事になると思います。

 

OpenCvSharpのインストール方法は、現在ではNuGetによりプロジェクトごとにインストールします。

 

OpenCvSharpのインストール方法

まず、インストールするC#プロジェクトを用意します。

新規でC#プロジェクトを作成する場合は、次のように行います。

Visual Studio を起動後、新しいプロジェクトの作成をクリックします。

次に Windowsフォームアプリケーション(.NET FRamework)を選択し、次へをクリックします。

プロジェクト名、場所を指定し、作成をクリックします。

これで、以下のようにフォームが表示されたらベースとなるC#プロジェクトが作成されています。

 

次に、このC#プロジェクトにNuGetでOpenCvSharpをインストールします。

メニューのプロジェクト→NuGetパッケージの管理をクリックします。

表示された画面で、 参照 を選択し、その下のテキストボックスに OpenCvSharp と入力すると、OpenCvSharpの一覧が表示されるので、この中から OpenCvSharp.Windows を選択します。

OpenCvSharp.Windows を選択すると、右側に インストール ボタンが表示されるので、これをクリックします。

しばらくすると、インストールが完了します。

OpenCvSharpがインストールされたか?確認するには、プロジェクトの参照の部分の表示を展開すると、OpenCvSharpの名前空間が表示されている事を確認します。

簡単にOpenCvSharpの動作を確認します。

ツールボックスの中から Button を選択し、フォーム上にドラッグ&ドロップします。

ボタンをダブルクリックし、C#コードを表示し、上の方に、

using OpenCvSharp;

と入力し、ボタンイベントの部分に以下のように記載します。

private void button1_Click(object sender, EventArgs e)
{
    var img = new Mat(new OpenCvSharp.Size(256, 256), MatType.CV_8UC3, new Scalar(35, 123, 254));

    Cv2.ImShow("Image", img);
}

参考までに、Formの全コードを示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using OpenCvSharp;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var img = new Mat(new OpenCvSharp.Size(256, 256), MatType.CV_8UC3, new Scalar(35, 123, 254));
            Cv2.ImShow("Image", img);
        }
    }
}

この状態で、▶開始 ボタンをクリックし、以下のように表示されれば OpenCvSharp のインストールは成功しています。

 

OpenCvSharpを使うポイント

2021年現在、OpenCVの情報はPythonであふれているので、OpenCvSharpの情報を探すのは難しくなってきています。

OpenCvSharpの情報を入手するには、少し古くなりましたが、作者であるSchimaさんのページを参照することをお勧めします。

http://schima.hatenablog.com/archive/category/OpenCvSharp

リファレンスは英語になりますが、こちらです。

http://shimat.github.io/opencvsharp/api/OpenCvSharp.html

 

あとは、OpenCvSharpは基本的にOpenCVのC++版のラッパーライブラリであるため、OpenCVのC++の情報を検索し、OpenCvSharpでは、どうするのか?を推測するのもイイかと思います。

 

参考

https://github.com/shimat/opencvsharp

http://shimat.github.io/opencvsharp/api/OpenCvSharp.html

OpenCVへ戻る

OpenCV2.3.1の入手、ダウンロード、インストール、環境設定

2012.5現在、OpenCVの最新バージョンはVer2.4です。
こちらのインストール方法についてはOpenCV2.4の入手、ダウンロード、インストール、環境設定を参照願います。


OpenCV2.3.1の入手、ダウンロード先

OpenCVの入手は下記ページよりダウンロードして下さい。

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/

 

上記リンク先へ行き、OpenCV-2.3.1-win-superpack.exeをクリックしてファイルをダウンロードして下さい。

 

OpenCV2.3.1のインストール方法

ダウンロードしたファイル(OpenCV-2.3.1-win-superpack.exe)をダブルクリックすると、ファイルの解凍が始まるので、ここでは c:\ に解凍する事にします。(慣れている人はどこでも構いません。)
Extract to:の部分に  c:\ と入力して下さい。

 

 

ファイルを解凍すると、主な構成は下記のようになっています。

c:\opencv
┣ 3rdparty
┣ android
┣ build
┃┣ common
┃┣ gpu
┃┣ include
┃┣ python
┃┣ x64
┃┃ ┣mingw
┃┃ ┣vc9
┃┃ ┗vc10
┃┗ x86
┃  ┣mingw
┃  ┣vc9
┃  ┗vc10
┃   ┣bin
┃   ┣lib
┃   ┗staticlib
┣ data
┣ doc
┣ include
┣ module
┗ samples

 

次にダウンロードしたdllファイルをPCから使えるようにPathの設定というのを行います。

 

Pathの設定はWindowsのスタートボタンをクリック → コンピュータ右クリックプ ロパティをクリックします。

 

 

開いたウィンドウの システムの詳細設定 をク リックします。

 

 

次に詳細設定タブの環境変数のボ タンをクリックします。

 

 

次にシステム環境変数のPathを選択し、編集をクリックします。

 

 

変数値のテキストボックスの最後の部分に、OpenCVのdllファイルのあるフォルダを指定します。

 

;C:\opencv\build\x86\vc10\bin

 

※もともとあった文字は消さないようにご注意ください。
最初の ; (セミコロン)を付けるのもお忘れなく。
PATHの設定後、PCを再起動して下さい。(ログオフ⇒ログインでも可)

 

上記の設定は32bitOSでVisual Studio2010を使う場合の設定です。
使用する環境に合わせてディレクトリを指定して下さい。

 

32bit、Visual Studio2008の場合 C:\opencv\build\x86\vc9\bin
32bit、Visual Studio2010の場合 C:\opencv\build\x86\vc10\bin
64bit、Visual Studio2008の場合 C:\opencv\build\x64\vc9\bin
64bit、Visual Studio2010の場合 C:\opencv\build\x64\vc10\bin

 

64bitOSを使っていても32bitでプログラムする場合は x86 フォルダ内のbinディレクトリを指定して下さい。
64bitを使う場合は、VisualStudioのプラットフォームをx64にして下さい。

 

TBBの入手、ダウンロード

OpenCV2.3.1のバイナリ版(コンパイルされているdll)を使う場合は、TBB(Intel Threading Building Blocks)という並列処理用のライブラリが必要となります。
OpenCVをダウンロードすると \opencv\build\common\tbb のフォルダにTBBのdllが入っているのですが、debug版が不足してます。

 

そのため、TBBのライブラリを入手します。

 

入手先
http://threadingbuildingblocks.org/

上記リンクのページへ行き、上側のメニューのDownloads⇒ページ中央部のStable Releaseと移動し、最新のバージョンのTBBをクリックします。(2012年1月現在、tbb40_20111130oss

 

次にWindows版のDownloadボタンをクリックし、ファイルをダウンロードします。
Windows版の場合、tbb40_20111130oss_win.zip

 

ダウンロードしたファイルを解凍すると下記のようなフォルダ構成になっています。
\tbb40_20111130oss_win\tbb40_20111130oss
┣ bin
┃┣ ia32
┃┃ ┣vc8
┃┃ ┣vc9
┃┃ ┗vc10
┃┗ intel64
┣ doc
┣ examples
┣ include
┗ lib

 

そこで、今回は32bitOSでVisualStudio2010を使う事を想定しているので、
フォルダ(\tbb40_20111130oss_win\tbb40_20111130oss\bin\ia32\vc10)内にあるdllファイル

 

tbb.dll、tbb_debug.dll、tbb_preview.dll、tbb_preview_debug.dll、tbbmalloc.dll、tbbmalloc_debug.dll、tbbmalloc_proxy.dll、tbbmalloc_proxy_debug.dll

 

を全てOpenCVのbinフォルダ(C:\opencv\build\x86\vc10\bin)へコピーして下さい。
32bit/64bit、VisualStudioのバージョンによりフォルダが異なるので、環境に合わせてフォルダを選択して下さい。

 

これで、OpenCVの設定は完了です。

 

VisualStudio2010での使用方法

使用するのはVisualStudio C++ 2010 Express以上のエディションで大丈夫です。

 

VisualStudio2010を起動し、新しいプロジェクトをクリックし、左側のメニューのWin32を選択した状態でWin32コンソールアプリケーションをクリックします。

 

 

適当な名前(上図ではOpenCV2.3.1Sample)を付け、保存する場所を指定し、OKボタンをクリックします。

 

すると下記のようなソースコードが表示されます。

 

// OpenCV2.3.1Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}

 

次にOpenCVのヘッダファイルが、今回作成したプロジェクトから参照できるように設定を行います。

 

プロジェクトの名前の部分を右クリックし、プロパティを選択します。

 

 

表示されたウィンドウ右上の構成を全ての構成にし、構成のプロパティ⇒C/C++⇒全般を選択して、OpenCV2のフォルダのあるディレクトリ(C:\opencv\build\include)を追加のインクルードディレクトリに指定します。

 

 

以上の設定を行い、ソース部分を下記のようにすると、ガウシアンフィルタ処理を行う簡単なサンプルプログラムが実行できると思います。

 


// OpenCV2.3.1Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// opencv2のあるフォルダ『C:\OpenCV\include』などを追加のこと
#include "opencv2\opencv.hpp"

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video231d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video231.lib")
#endif

int _tmain(int argc, _TCHAR* argv[])
{

    //画像データの読込
    IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
    if (src_img == NULL){
        return 0;
    }

    //表示ウィンドウの作成
    cvNamedWindow("src");
    cvNamedWindow("dst");

    //処理後画像データの確保
    IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels);

    //画像処理例(ガウシアンフィルタ)
    cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9);

    //画像の表示
    cvShowImage ("src", src_img);
    cvShowImage ("dst", dst_img);

    //キー入力待ち
    cvWaitKey (0);

    //全てのウィンドウの削除
    cvDestroyAllWindows();

    //画像データの解放
    cvReleaseImage(&src_img);
    cvReleaseImage(&dst_img);

    return 0;
}

 

ちなみに、libファイルは全て必要ではなく、おおむね

 

opencv_core231、opencv_imgproc231、opencv_highgui231、opencv_objdetect231

 

の4種類ぐらいである程度動作すると思います。(使用する関数によって必要なlibファイルが決まります。)

 

また、libファイルのファイル名に含まれる数字部分がOpenCVのバージョンを示し、ファイル名の最後についているdの文字がDebug用のlibファイル、dの無いファイルがRelease用のlibファイルとなっています。

 

その他

OpenCV2.3.1においてもCMakeを使って自分でOpenCVをコンパイルする事が可能です。

 

CMakeのソースコードにはOpenCV-2.3.1-win-superpack.exeを解凍したフォルダ(opencv)を指定して下さい。

 

OpenCV2.3の場合の説明ですが、詳細は下記ページを参照下さい。

 

https://imagingsolution.net/program/opencv/opencv2-3/opencv2-3-downlaod-install/#compile-opencv

 

基本的にOpenCVなどのライブラリを使う場合は、ライブラリの3点セット(*.dll、*.lib、*.h)をいかに使うか?がポイントになります。

 

余裕のある方は下記ページも参考にしてみて下さい。

ライブラリの使用方法、VisualStudioの設定方法

 

これを覚えておくと、OpenCVがバージョンアップした場合や他のライブラリを使う場合など、応用ができると思います。
 

OpenCVへ戻る

 

OpenCV 2 プログラミングブック OpenCV 2.2/2.3対応

OpenCV2.0から登場したC++インターフェースに日本語で初めて?対応した参考書が登場します。

従来のOpenCV プログラミングブックを持っている方も多いかと思いますが、その第3弾です。

 

全くのOpenCV初心者にとっては、少し難しく感じるかも?しれませんが、これまでC言語のOpenCVを使っていた人が、C++インターフェースを使ってみたいという人には、ちょうど良いと思います。
個人的にはcv::Matを画像データに使う事は無いのですが、行列演算に使う分にはC++インターフェースもかなり、便利だと感じました。
ケーススタディもあるので、参考になると思います。

 

 

正誤表はこちらにあるので、読む前にチェックして下さい。
http://book.mycom.co.jp/support/pc/opencv2/#ERRATA

 

【目次】

 

▽Chapter.1 導入 編
1.1 画像処理とコンピュータビジョン
1.2 OpenCV
1.3 OpenCV 2.0
1.4 ライセンス条項

 

▽Chapter.2 スタートアップ 編
1 OpenCV 2.3簡単インストール(Windows編)
1.1 OpenCVの取得
1.2 OpenCVのインストール
1.3 環境変数の設定
1.4 Visual C++ 2010の環境設定
1.5 新規プログラムの作成方法
1.6 サンプルプログラムの実行

2 OpenCVをMacで利用する
2.1 Xcodeのインストール
2.2 MacPortsのインストール
2.3 OpenCVのインストール
2.4 サンプルプログラムによる動作確認
2.5 XcodeでOpenCVを使う

3 Ubuntu 10.04 LTSでOpenCVを利用する
3.1 設定
3.2 luvcviewでキャプチャ
3.3 luvcviewの使い方
3.4 aptパッケージを使ったOpenCVのインストール
3.5 新しいバージョンのOpenCVのインストール

4 C++インタフェース
1 OpenCV 2.0のC++向けインタフェースについて
2 従来のインタフェースとの違い
3 従来のインタフェースとC++インタフェースを混在させる

5 Pythonインタフェース
5.1 Pythonインタフェースのインストール
5.2 Pythonインタフェースを試す

6 GPUによる画像処理
6.1 OpenCVのGPU対応
6.2 OpenCVでGPUを利用した画像処理を行う方法
6.3 インストール
6.4 プログラムの作成
6.5 サンプル

 

▽Chapter.3 リファレンス 編
1 cv::Matの基本処理
1.1 cv::Matを初期化する
1.2 cv::Matのそのほかの処理
1.3 cv::Matの様々なプロパティ
1.4 std::cout への出力
1.5 cv::Matの型(ビット深度)を変換する
1.6 cv::Matをリサイズする
1.7 cv::Matを変形する
1.8 cv::Matの要素をシャッフルする
1.9 cv::Mat_を使う
1.10 cv::Matxを使う
1.11 cv::Vecを使う
1.12 cv::MatとIplImageの相互変換
1.13 cv::MatとCvMatの相互変換
1.14 cv::MatとSTL vectorの相互変換
1.15 cv::Matとcv::Matxの相互変換
1.16 cv::Matとcv::SparseMatの相互変換
1.17 cv::MatとEigen::Matrixの相互変換
1.18 チャンネルの合成と分離
1.19 列/行ごとの合計,平均値,最小,最大値を求める

2 線形代数
2.1 行列要素の四則演算を行う
2.2 行列同士の積を求める
2.3 cv::Vecの内積と外積
2.4 ノルムを求める
2.5 行列式を求める
2.6 行列の転置
2.7 行列の対角成分を取り出す
2.8 行列のトレースを求める
2.9 逆行列/疑似逆行列を求める
2.10 2次元ベクトルの角度と大きさを求める
2.11 角度と大きさから2次元座標を求める
2.12 行列を反転する
2.13 行列要素の最小値・最大値を求める
2.14 2次元点集合間の最適なアフィン変換を推定する
2.15 連立1次方程式を解く

3 画像処理
3.1 画像を単色で塗りつぶす
3.2 色空間を変換する
3.3 画像サイズを変更する
3.4 画像を垂直・水平に反転する
3.5 画像をネガポジ反転する
3.6 画像を2値化する
3.7 画像ピラミッドを作る
3.8 画像を平滑化する(ぼかす)
3.9 点座標集合に外接する図形を求める
3.10 画像の修復・不要オブジェクトを除去する
3.11 直線を検出する
3.12 円を検出する
3.13 楕円フィッティングを行う
3.14 画像のヒストグラムを計算・描画する
3.15 画像の一部を切り抜いて保存する
3.16 画像の一部のみを処理する
3.17 矩形領域のピクセル値をサブピクセル精度で取得する
3.18 顔を検出する
3.19 目を検出する
3.20 複数の矩形をグループ化する
3.21 チャンネルの合成と分離
3.22 画像に境界領域を追加する

4 描画処理
4.1 線分を描く
4.2 矩形を描く
4.3 円を描く
4.4 楕円・円弧を描く
4.5 折れ線を描く
4.6 ポリゴンを描く
4.7 テキストを描く

5 入出力
5.1 画像を表示する
5.2 ファイルから画像を読み込む
5.3 ファイルに画像を書き出す
5.4 カメラ画像をキャプチャする
5.5 画像をメモリ上でエンコード/デコードする
5.6 YAML/XMLを読み込む・書き出す

6 その他の機能
6.1 OpenCVのバージョンを調べる
6.2 処理時間を計測する
6.3 printf風の表記で文字列を出力する
6.4 CV_Assert/CV_DbgAssert
6.5 CPUがサポートする機能(SSEなど)をチェックする

 

▽Chapter.4 ケーススタディ 編
1 画素値の直接操作
1.1 画素単位の操作
1.2 サンプルプログラムと速度比較
1.3 画像のディザリング – 画素値の直接操作事例1
1.4 画像の細線化 – 画素値の直接操作事例2

2 カメラキャリブレーションとステレオ視による距離計測
2.1 カメラキャリブレーション
2.2 ステレオマッチング

3 画像のJPEG圧縮とPSNRの計算
3.1 PSNR
3.2 プログラムと実行結果

4 簡単な笑顔度の算出
4.1 笑顔度の算出方法
4.2 プログラムと実行結果

5 CAPTCHA画像の生成
5.1 解読を困難にするには
5.2 プログラムと実行結果

6 KinectとOpenCVの連携
6.1 Kinectとは
6.2 ドライバ一式のインストール
6.3 プログラムと実行結果

7 ミニチュア風画像処理
7.1 プログラムと実行結果

8 SURF特徴を使ったイメージモザイキング
8.1 イメージモザイキングの流れ
8.2 特徴点抽出
8.3 前フレームとの特徴点の対応付け
8.4 ホモグラフィ行列の推定と画像ワーピング
8.5 画像の重ね合わせ(画像マスク)
8.6 イメージモザイキングプログラムと実行結果

9 機械学習と画像処理
9.1 学習の種類
9.2 混合ガウス分布とEMアルゴリズムを用いたクラスタリング
9.3 OpenCVにおける実装
9.4 オプティカルフローのクラスタリング
9.5 クラスタリング手法の適用
9.6 実行結果

10 顔の子供化
10.1 子供らしく見える顔
10.2 顔の子供化処理

11 Photoshop向けプラグインの作成
11.1 Photoshop プラグインについて
11.2 環境の作成

12 動画ファイルをカメラ入力のように扱う
12.1 動画ファイルの入力
12.2 VideoCaptureのパラメータ

 

OpenCVへ戻る