読者です 読者をやめる 読者になる 読者になる

★ The Tsuchinoko News 2 (つちのこ通信2) ★

重要な話から、どうでもいいことまで。ほとんど役に立たないことを書き連ねています。

【PC】OpenCVをVisualStudio2012から使う(OpenCVSharp)

かつて、はるか昔に画像処理用のライブラリに GDI というものがあった。単に線を引くとか四角を書くとか、わりと基本的な画像描画用のもので、その歴史は結構古い。DOSの真っ暗な画面から Windows のカラフルな原色の世界になったころ、とくにゲーム・プログラミングの世界で重宝されていた。 このGDI に、もうちょっと機能アップして Bitmapを触りやすくしたのが Microsoft。GDI+ と 名付けられたライブラリは、いつしか Windows API に組み込まれ、いまでは .NET Framework のドロー系命令の標準になっている。これで、ずいぶんと描画処理は楽になった。

しかし画像を解析するとか写真画像の色調整をするとか、そういう Photo Shop のような画像編集などになると GDI+ では全く役に立たず、ちまちまと自分で手作りしていくしかなかった。そこに出てきたのが OpenCV というもので、ドロー系というよりは画像系。エッジ検出やら、エンボス効果、トリミングや自動傾き検出など、いろいろと使える。

しかしながら OpenCVそのものは C++製なので、そのままつかうと「処理だけ」なら困ることはないかも知れないが、ユーザーインターフェースも、となると、なにしろ C++ なので大変な労力を要する。そこで、そうしたものがお得意な VB や VC# で OpenCV を利用するためのラッパーが、いろいろと登場。わりとかんたんに 使い慣れた Visual StudioBasicC# から OpenCVが利用できる環境が整ってきた。

f:id:tsuchinoko118:20140921054400p:plain
あなたのワークバランス大丈夫? ワークバランス診断アプリ BSC for Android
ラッパーにもいろいろとあるが筆者は 主に C#でコーディングする人なので OpenCVSharp を使っている。それぞれのラッパーにも、いろいろと特徴があるので、決して OpenCvSharp こそ決定版というわけでもないのだが、非常に多くの OpenCV(C++)の関数が内包されていて、OpenCV風のラッパー関数となっていて、かつ C#風な記述(例えばとくに using など)ができるようになっており、筆者にとっては使いやすいというのが理由だ。

また、OpenCVにしてもそうだが、OpenCVSharpになるとマニュアル本が全くといっていいほどない。添付のドキュメントを参照するか、ネット上のサンプルなどを探したりすればいいのだがのだが、これも意外に少なく、OpenCV(C++)風の記述が可能なので OpenCVのサンプルやクックブックを参考にすれば、わりとカンタンに理解し、利用することができることも 筆者が OpenCVSharp を使う理由となっている。

先日より(およそ半年前から)本格的に Visual Studio 2012 を使っているのだが、VS2012 で OpenCV を使える状態にする方法が、VS2005,2008,VS2010とはちょっと違うので、備忘録としてインストール方法と注意点をここに残すことにした。


(1)OpenCVのインストール

インストールと言ってもVS2012で利用するには単にダウンロードして、解凍し、DLLを呼び出せるように 環境変数PATH を設定するだけ。

ダウンロードは いろいろあるみたいだけど OpenCV.JP では 2.2で止まってるようなので筆者は
、ここ→http://sourceforge.jp/projects/sfnet_opencvlibrary/downloads/opencv-win/2.4.5/OpenCV-2.4.5.exe/ からダウンロードした。

ダウンロードしたらダブルクリックで起動。

何か言ってくるけど、気にせず実行。

解凍先として、適当な場所を指定(あらかじめフォルダを作っておくこと)筆者は何でも C:\VS2012POJ に放り込んでいるので、画面では、そのような指定になっている。EXTRACTボタンを押すと解凍が始まる。

待つ。けっこう大きいので時間がかかる。

指定したフォルダの下に OpenCV が出来上がって、なにやら多数のファイルがある。

この中の build → x86 → vc11 → bin に、OpenCV(C++)で作られた DLLがあるので、このパスを環境変数 PATH に設定する。(筆者は 32Bit/64Bit両対応のものを作らないといけないので x86 を指定している。また VS2012 用は vc11 なので、それを使う)

コントロールパネルのシステムを開いて、システムの詳細設定を押す。

環境変数を押す。

下の段(上でもいいのかも)の Path をダブルクリック。

さきほどの DLLのフォルダ名をフルパスで追加する。

;C:\VS2012PROJ\OpenCV\build\x86\vc11\bin
↑「;」を忘れないようにする。

設定したら「OK」で、パソコン再起動。これで OpenCVの準備は完了。


(2)OpenCVSharpのインストール

次にラッパーの OpenCVSharp をインストール。
こちらもダウンロードして解凍するだけ。
実際に使う際は VS2012 から「参照の追加」で、必要なものだけ追加して利用する。

こちら→ http://code.google.com/p/opencvsharp/ のダウンロードから OpenCvSharp-2.4.5-x86-20130522.zip をダウンロード。(こちらも筆者は x86で使うので x86をダウンロード)

普通のZipファイルなので、解凍して、まるごと全部を適当なフォルダにコピペする。
これで OpenCvSharp は準備完了。


(3)VS2012(C#)でサンプルプログラムを動作しテスト

新しいプロジェクトから C# のコンソールアプリケーションを作成する。

プロジェクト → 参照の追加で参照マネージャーを開いて、「参照」ボタンを押して
さきほど準備した OpenCVSharp の OpenCVSharp.DLL を 指定する。
(他にもいろいろあるけれど、とりあえずサンプルで必要なのは OpenCVSharp.DLL だけ。使いたい関数やクラスに応じて必要な DLL を参照する)

OpenCV(C++)のDLL の方は C#用の参照ではないので参照追加は不要。
ただし PATHがきちんと通ってないと(環境設定のPathが設定されていないと)エラーが出る。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using OpenCvSharp;

namespace ConsoleApplication1 {
    class Program {
        static void Main( string[] args ) {
            IplImage img = Cv.CreateImage( new CvSize( 128,128 ),BitDepth.U8,1 );

            for( int y = 0; y < img.Height; y++ ) {
                for( int x = 0; x < img.Width; x++ ) {
                    Cv.Set2D( img,y,x,x + y );
                }
            }

            Cv.NamedWindow( "window" );
            Cv.ShowImage( "window",img );
            Cv.WaitKey();
            Cv.DestroyWindow( "window" );

            Cv.ReleaseImage( img );
        }
    }
}

サンプルプログラムを記述する。
using OpenCvSharp; を忘れないように。

また 筆者の場合は x86 版なので、構成マネージャーの方でも プラットフォームを x86 にしている。ここを AnyCPUのままにしておくと、エラーが出るようだ。
ここも注意。

実行して、黒~白の斜めグラデーションの小さな窓が表示されたら 動作環境は準備完了。
これで、OpenCV + OpenCvSharp を利用できるようになった。


(4)配布するときの注意

VS2012についてくる Install Shield で配布するとき(インストーラーを作成するとき)は、同梱すべき .NET Framework の再配布可能パッケージはもちろん、OpenCV(C++)用に VC2012++ x86版の再配布可能パッケージも入れないと、配布先で動作しない可能性がある。
あとから手動で入れてね!というのも、なんとも不細工な感じなので、同梱したいのだが、バグのようなものがあり x86版の VC++2012再配布可能パッケージ を同梱すると Windows 7 の 64Bit版だけ、これがインストールされないようだ。
このあたりは、こちら → http://njc.hatenadiary.com/entry/2013/05/17/%E3%80%90PC%E3%80%91InstallShield2012_%E3%81%A7_VC%2B%2B2012%E3%81%AEx86%E7%89%88_%E3%82%92%E5%90%8C%E6%A2%B1%E3%81%99%E3%82%8B%E3%81%A8_64Bit%E7%89%88Win7%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88 を参考にして、ちょっと修正してあげる必要がある。