Visual Basic.NetでOpenCV3(OpenCvSharp3)を使う

## 初めに
Visual Basic.NETにおいて、OpenCV 3の環境構築手順を示します。
ここでは[OpenCVSharp3](http://schima.hatenablog.com/entry/2013/12/15/110513 "blogの方。古い")を使用しました。VB.NETでOpenCVを使う方法は他にも存在しますが、下記が採用の決め手です。

	- Python3(Raspberry Pi上)のコードを簡単にポーティングできた
	- 作者が日本の方で応援したい
	- 今年に入ってからも更新されており好感を持てた
	- 最初にチャレンジした環境なので原点に戻った

どうせ新規で始めるなら、今後の機能追加がないOpenCV 2ベースよりも3で統一することをお勧めします。小職は検索キーが的を射ていなかったためか、いろいろなSiteの内容を試しているうちに2と3の内容がごっちゃになってはまりました。

ここに集まる皆さんにとっては何を今更とお思いでしょう。
2か月程前に必要に迫られてOpenCVを.NET上で動かす方法を調べ始めたのですが、ほとんどがC#向けに書かれており、それを参考にOpenCVSharpを導入、見よう見まねで記事の内容をC#→Basicに書き直してはみるものの「定義されていません」とエラーがでて途方に暮れていたのです(IplImage絡みでした)。

Prototypeを作ったRaspberry PiではCMakeを使ってBuildするなど環境構築に手間はかかったものの、OpenCV3+Python3のサンプルが容易く動作しました。それをデモったばかりに大変なことになりましたが...

作者のBlogにNuGetパッケージを公開したと書かれていた(それまではNuGetって何？状態)ことから、藁をもつかむ思いで試し、ようやくアプリが書けるところまできました。
※その記事は2013年末のものでOpenCV2です。どうやってOpenCvSharp3にたどり着いたか、今となっては思い出せません。文書は記憶のあるうちに仕上げておきましょう。

## 実行環境
- Microsoft Visual Studio Community 2017 Release/15.7.6+27703.2047  
 (VS2015でも動いています)
- Microsoft .NET Framework Version 4.7.03056
- Windows 10 Home x64
- インターネット接続可能な状態であること

## 作業手順
前述の通り、VB.NETでOpenCV 3+OpenCvSharp3を使うには、NuGetで導入するだけです。

#### 1. プロジェクトの新規作成
![02_newProj作成s.png](https://qiita-image-store.s3.amazonaws.com/0/273799/adb8e484-0a2d-fe4e-a9c4-a5bab7ee0196.png)

〔Windowsデスクトップ→Winodwsフォームアプリケーション〕を選択します。ここでは名前を"tmpOpenCvSharp"としました。

#### 2. NuGetの管理を開く
![03_NuGetの管理.png](https://qiita-image-store.s3.amazonaws.com/0/273799/b29f8b77-1182-fde7-7372-69acd347c129.png)

〔ソリューションエクスプローラー〕の「ソリューション'tmpOpenCvSharp'」を右クリックし、〔ソリューションのNuGetパッケージの管理〕を選択します。

#### 3. OpenCvSharp3を検索
新規作成のソリューションでは〔インストール済み〕には何も表示されていません。〔参照〕を選択し、"opencvsharp3"と入力すると、関連ファイルが一覧表示されます。たくさん表示されて面食らいます(ちょっと前まではWithoutDllを含めて３つしか表示されなかった)。
作成者: Shimat さんの「OpenCvSharp3-AnyCPU」を選択します。
![04_NuGetOrgからOpenCvSharp3を検索.png](https://qiita-image-store.s3.amazonaws.com/0/273799/13d9456f-df2b-4ac0-fa86-5d00331baf42.png)

#### 4. インストール開始
〔インストール〕ボタンを押下します。「変更のプレビュー」が表示されるので、〔OK〕を選択するとインストールが始まります。
![05_変更のPreView.png](https://qiita-image-store.s3.amazonaws.com/0/273799/bcc0ef49-fa43-7ed2-31ad-7adec107ddb9.png)

#### 5. インストール終了
![06_Install終了.png](https://qiita-image-store.s3.amazonaws.com/0/273799/4136574a-68fd-3e70-518c-c4808bf0b1ee.png)
インストールが終了すると〔NuGet tmpOpenCvSharp〕タブの右下ペインの内容が更新されます。

	- インストール済み：3.4.1.20180319  ('18/8/15現在)
	- バージョン：      最新の安定版

#### 6. 動作確認
正常にインストールされていることを確認します。
Form1.vbの先頭にImportsと記述すると、補完候補に "OpenCvSharp"が表示されます。
![07_importsにOpenCVSharpが.png](https://qiita-image-store.s3.amazonaws.com/0/273799/1acf2136-61cd-e07a-20b4-dc8d4e34ad8f.png)

## サンプルプログラム
早速、好きな写真を表示してみましょう。
下記のソースを参考にしてください。フォームアプリケーションでプロジェクトを生成しているので、Form1_Load時に表示させてみます。追加のコントロールはありません。
ファイル形式は ".png" 以外のFormatにも対応しているのでいろいろ試してみてください。

```VB.Net:Form1.vb
Imports OpenCvSharp

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim img As Mat = New Mat("./真夏ほおづえ.png")
        Cv2.ImShow("Nogi46", img)
        Cv2.WaitKey(5000)

        Cv2.DestroyWindow("Nogi46")
    End Sub

End Class
```

サンプルとしては、いけてないですが、

　　Title **Nogi46** Windowに指定画像を表示し、
　　キー入力を5秒待ち、
　　**Nogi46** Windowを閉じる

の動作が確認できます。
指定されたファイルが見つからないという「System.IO.FileNotFoundException」が発生する場合は、tmpOpenCvSharp.exeが生成される場所に画像ファイルを置くか、ファイル名にPathを追加して下さい。

OpenCVにはVB.NETで記述するにはとても面倒なキー入力待ちetc.の関数が用意されており、気軽に記述できるのがうれしいところです。
ただ、この手のサンプルの記述はよく見かけますが、VB.NETとしては不満が残ります。それは、
<br>
　　**描画WindowがVisual Studioでデザインされたものではない**
<br>
VB.Netのコントロールで完結させたいのです。資料を探せば見つかることかも
知れませんが... どこを探したらよいのか、未だにわかりません。


実はここでVisual Studioの補完機能に助けられました。
これについては、改めて書きたいと思います。

最後になりましたがOpenCvSharp作者のschima様、並びに関係者の皆様にお礼を申し上げます。

---
##### 筆者レベル
Visual Basicのコードメンテナンスを任されて約2年。これがVSを使った初のWindowsアプリとなった。専従ではないため、コード修正依頼のたびに文法を忘れている。Classを作るのが怖くて、何でもModuleで済ませたがる。