C#でOpenCVを動かす~NuGetでOpenCV.Netをインストール

2013/12/27追記) 2013/12/15にOpenCvSharpにも使いやすいNuGetパッケージが公開された.この記事で紹介するOpenCV.NetよりもOpenCvSharpのほうがおすすめ.以下のページに詳しい解説があるので参照.
OpenCvSharpをつかう その17(NuGetで導入) - schima.hatenablog.com

概要

OpenCVをC#から使う.少し説明とか書きますが「御託はいいからさっさとやり方教えろよ」という方はここをクリック

Nuget経由でインストールできるOpenCV.Netというラッパを使用.Nugetを使えば,必要なdllをまとめて持ってきてくれる(パッケージ作者がちゃんと作ってくれてれば)ので面倒なOpenCVのインストールとか不要なため楽.

なんでOpenCV.Netを使うのか

OpenCVのC#ラッパはいくつかあるようだが,以下の2つあたりがメジャーなところと思われる.

作者が日本人らしく,日本語ドキュメントもあって,導入もそんなに難しくないので良い感じ.定期的にリリースもされてるし.

偉そうに書いておきながら使ったことがないです,ごめんなさい.ただ,2008年ころからありOpenCV2.4まで対応しているので,そこそこ良い感じなのではなかろうか.

今回使うのは上の2つのどちらでもないOpenCV.Net.現状ではあまりメジャーではなさそう.

ではなぜOpenCV.Netを使うのか.導入が簡単で手軽に使いやすいから.それだけ.上でも書いたが,NuGet経由でインストール可能.現状では実装されている関数はOpenCvSharpとかのほうが多いと思うので,色々やろうと思うとそっち使ったほうが良さそう.

ちなみに自分でラッパを作れば基本的にどの機能でも使えるようになる.やり方は以下のページを参照.
C#でOpenCVを使う(C++/CLIによる方法) - whoopsidaisies's diary

使い方

NuGetってなんなの

Visual Studioのパッケージ管理システム.NuGetに登録されているライブラリであれば,わざわざ公式サイトにいってダウンロードして,インストールして,使い方調べて...みたいな面倒なことをしなくても,Visual Studioの操作だけで簡単にインストールできるという便利なもの.

NuGetのインストール

Visual Studio 2012の場合は最初から使えるからインストールは不要.Visual Studio 2010の人はこことか参考にしてインストールしてください.

NuGetパッケージの管理から「OpenCV.NET」をインストール

ソリューションエクスプローラーからプロジェクトを右クリックして「NuGet パッケージの管理...」を選択.オンラインの検索で「opencv」とかで検索したら「OpenCV.NET」というパッケージが出てくるのでインストールする.すると,「OpenCV.redist」というパッケージも一緒にインストールされる.
「OpenCV.NET」がC#ラッパで,「OpenCV.redist」がOpenCVのDLLとか.
 

プラットフォームを「Any CPU」以外にする

ここ忘れるとはまるので注意.プロジェクトのプラットフォームを「x64」か「x86」に変える.「Any CPU」だと使えないみたい.ちゃんとした理由は調べてない.
やり方がわからない場合はこことかを参考に.

Visual C++ 再頒布可能パッケージいるかも?(後日ちゃんと確認して修正します.)

必要っぽい気がする.ただ,今作業中の環境がインストール済みなので,ない場合に動くかどうか確認できない.後日,確認・修正します.
http://www.microsoft.com/ja-jp/download/details.aspx?id=30679

動作確認

動作確認のために,sobelフィルタによるエッジ抽出を行ってみる.ソースコードは以下.

static void Main(string[] args)
{
    // ファイルから画像読み込み
    var img = OpenCV.Net.CV.LoadImage(@"C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg", OpenCV.Net.LoadImageFlags.AnyColor);
    // エッジ画像格納用の変数作成
    var dst = img.Clone();

    // sobelフィルタ適用
    OpenCV.Net.CV.Sobel(img, dst, 1, 1);

    // 原画用のウインドウ生成
    var windowOrg = new OpenCV.Net.NamedWindow("原画");
    // 原画表示
    windowOrg.ShowImage(img);
    // エッジ用のウィンドウ生成
    var windowEdge = new OpenCV.Net.NamedWindow("エッジ");
    // エッジ表示
    windowEdge.ShowImage(dst);

    // キー入力待ち
    OpenCV.Net.CV.WaitKey(0);
}

こんな感じに原画とエッジ画像が表示されれば成功.
f:id:whoopsidaisies:20131025002136p:plain

最後に

実はNuGetにOpenCvSharpのパッケージもあるのだけど,こちらは一緒にOpenCVのdllを持ってきてくれないので今回は使わなかった.NuGetはパッケージの依存関係のあるライブラリを自動で一緒にインストールしてくれるのが良いところ.それがないパッケージは有効性が低いかなと.

NuGetのギャラリーを見ると,便利なパッケージが結構たくさんあるが,NuGetに登録していないライブラリもたくさんあると思う.ライブラリの作者さんたちはみんなNuGetに登録しまくってくれたらいいと思う.こうやって,環境が変わっても再構築せずとも利用できるという方向にどんどん進んでほしい.楽したい.あと,まわりの人にも使ってもらいたい.