OpenCvSharpをつかう その17(NuGetで導入)

前々からの野望だったNuGetパッケージを、このたび公開しました!
その1で紹介した方法よりもずっと簡単に使い始めることができるはずです。OpenCVの事前インストールも不要です。

まだ作りたてほやほやなので変更されるかもしれませんが、ひとまずの使い方紹介をいたします。Windows / Visual Studio環境のみ念頭に作っています。

NuGetのページは以下です。
https://www.nuget.org/packages/OpenCvSharp-AnyCPU/

OpenCvSharpをつかう 記事一覧

環境の準備

NuGetは、Visual Studio 2012以降なら標準搭載だったかと思います。

Visual Studio 2010では、Professional以上のエディションで対応しています。以下のプラグインを導入します。
http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c

Visual Studio 2010 ExpressではNuGetを利用できないそうです。最新のExpress 2013を導入しましょう。以降は、「Visual Studio Express 2013 for Windows Desktop」を使用している前提で進めます。
http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop

NuGetパッケージの導入

長々書いていますが、要は「入れるだけ」です。わかっている方は読み飛ばしてかまいません。

プロジェクト

Visual C# の「コンソール アプリケーション」で新規プロジェクトを作成します。

NuGetパッケージの選択

ソリューションエクスプローラのプロジェクトを右クリックするか、上のメインメニューの「プロジェクト」を選択し、「NuGet パッケージの管理...」を選択します。

左側で「オンライン」を選択した状態で、右上のテキストボックスで「opencvsharp」のように打ち込んで検索してみると、このように表示されます。上から2番目のレナさんのアイコン付きのものが、私が作ったパッケージです。
(なお一番上のパッケージは、私があずかり知らぬところで、奇特な誰かさんがもっと以前に公開していたものです。その奇特さに感謝するとともに、別にそちらをお使い頂いても構いません。OpenCV2.4.0ベースのようです。)

f:id:Schima:20140523140023p:plain

OpenCVのバイナリ配置

「インストール」を押すと、自動的に必要なDLLがプロジェクトに追加されます。

新しいリリースから、VisualStudio上では見えなくなりましたが、OpenCVのネイティブDLLが自動的にbinフォルダの中にコピーされます。
https://github.com/shimat/opencvsharp/pull/104

以降は古い版での記述です。

プロジェクトにdllというディレクトリが追加され、その下にOpenCVのDLLが配置されます。

OpenCVは別の場所にインストール済み」かつ「自分はDLLの依存関係やアーキテクチャ周りに熟知している」という方は、これらは遠慮なくバッサリ全部消して構いません。自信の無い方はそのままにしておいてください。

プラットフォーム設定

NuGetで導入すると、構成マネージャのプラットフォームに自動的に x86 または x64 が追加されるようにしています。可能であれば、適宜x86またはx64に変えて明示的に指定することをお勧めします。

Any CPUのままにした場合は、環境に応じて自動的にx86またはx64OpenCVのDLLを探して読み込みに行きます。具体的には プロジェクトに追加された dll/x86 または dll/x64 以下のDLLファイルが読み込み対象となります。

なお、プラットフォーム設定をしようにも下図のようにツールバーが出ていない場合は、メインメニューの「ビルド」->「構成マネージャー」から設定できます。
f:id:Schima:20131215104408p:plain

実行

以上、色々書きましたが、要するにNuGetで探して取ってくるだけで終わりです。楽ですね!

プログラムを書きましょう。その1と同様のものを書いても良いですし、せっかくなので以下は別のサンプルを挙げています。レナさんの画像はあらかじめ準備してください。

using System;
using System.Collections.Generic;
using System.Text;
using OpenCvSharp;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var img = new IplImage(@"C:\Lenna.png"))
            {
                Cv.SetImageROI(img, new CvRect(200, 200, 180, 200));
                Cv.Not(img, img);
                Cv.ResetImageROI(img);
                using (new CvWindow(img))
                {
                    Cv.WaitKey();
                }
            }
        }
    }
}

こんなちょっとビビる画像が出たら成功です。
f:id:Schima:20131215105206p:plain

もうひとつ、以下はラベリングを試すコードです。これも面倒な設定なしにそのまま動く・・・と思います。

using System;
using System.Collections.Generic;
using System.Text;
using OpenCvSharp;
using OpenCvSharp.Blob;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var img = new IplImage(@"C:\shapes.png", LoadMode.GrayScale))
            using (var imgBin = new IplImage(img.Size, BitDepth.U8, 1))
            using (var imgRender = new IplImage(img.Size, BitDepth.U8, 3))
            {
                Cv.Threshold(img, imgBin, 0, 255, ThresholdType.Otsu);
                var blobs = new CvBlobs(imgBin);
                blobs.RenderBlobs(imgBin, imgRender);
                CvWindow.ShowImages(img, imgBin, imgRender);
            }
        }
    }
}

エラーなく動くと期待していますが、もし出た場合の対処は別エントリで書こうと考えています。

XMLドキュメントコメントについて

Visual Studioで開発しているときに、コード上に出てくるポップアップの説明書きです。

NuGetで導入した場合は、英語のものがあてがわれます。現状、残念ながら日本語にはなりません。ご注意ください。

もし日本語化する場合の手順は以下です。

  1. 以下のReleasesページから手動でOpenCvSharpのzipを落としてくる
  2. 中に入っている OpenCvSharp.xml などのXMLファイルを取得 (XmlDoc-Japaneseの中にあります)
  3. 手元のプロジェクトのNuGetで取得したファイルに上書きする (packagesというフォルダの下にあるはずです)

https://github.com/shimat/opencvsharp/releases