初めに
Visual Basic.NETにおいて、OpenCV 3の環境構築手順を示します。
ここではOpenCVSharp3を使用しました。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. プロジェクトの新規作成
〔Windowsデスクトップ→Winodwsフォームアプリケーション〕を選択します。ここでは名前を"tmpOpenCvSharp"としました。
2. NuGetの管理を開く
〔ソリューションエクスプローラー〕の「ソリューション'tmpOpenCvSharp'」を右クリックし、〔ソリューションのNuGetパッケージの管理〕を選択します。
3. OpenCvSharp3を検索
新規作成のソリューションでは〔インストール済み〕には何も表示されていません。〔参照〕を選択し、"opencvsharp3"と入力すると、関連ファイルが一覧表示されます。たくさん表示されて面食らいます(ちょっと前まではWithoutDllを含めて3つしか表示されなかった)。
作成者: Shimat さんの「OpenCvSharp3-AnyCPU」を選択します。
4. インストール開始
〔インストール〕ボタンを押下します。「変更のプレビュー」が表示されるので、〔OK〕を選択するとインストールが始まります。
5. インストール終了
インストールが終了すると〔NuGet tmpOpenCvSharp〕タブの右下ペインの内容が更新されます。
- インストール済み:3.4.1.20180319 ('18/8/15現在)
- バージョン: 最新の安定版
6. 動作確認
正常にインストールされていることを確認します。
Form1.vbの先頭にImportsと記述すると、補完候補に "OpenCvSharp"が表示されます。
サンプルプログラム
早速、好きな写真を表示してみましょう。
下記のソースを参考にしてください。フォームアプリケーションでプロジェクトを生成しているので、Form1_Load時に表示させてみます。追加のコントロールはありません。
ファイル形式は ".png" 以外のFormatにも対応しているのでいろいろ試してみてください。
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としては不満が残ります。それは、
描画WindowがVisual Studioでデザインされたものではない
VB.Netのコントロールで完結させたいのです。資料を探せば見つかることかも
知れませんが... どこを探したらよいのか、未だにわかりません。
実はここでVisual Studioの補完機能に助けられました。
これについては、改めて書きたいと思います。
最後になりましたがOpenCvSharp作者のschima様、並びに関係者の皆様にお礼を申し上げます。
筆者レベル
Visual Basicのコードメンテナンスを任されて約2年。これがVSを使った初のWindowsアプリとなった。専従ではないため、コード修正依頼のたびに文法を忘れている。Classを作るのが怖くて、何でもModuleで済ませたがる。