Visual Basic でOpenCV② - Windows フォームアプリ

Visual BasicOpenCVを使う入門を紹介します。Windows フォームアプリの例を紹介します。

Windows フォームアプリ

Windows フォームアプリでOpenCvSharp を使用する例を紹介します。

Visual Studio 2022 Community を起動し、[新規作成]→[プロジェクト]を選びます。
②「新しいプロジェクトの作成」画面が現れますので「Windows フォームアプリ」を選びます。
③「新しいプロジェクトを構成します」画面が現れますので「プロジェクト名」や「場所」などを指定します。
④これでプロジェクトが作成されます。このプロジェクトには、自動で生成されたフォームとソースファイルが含まれます。

自動生成されたForm1.vb を示します。

Public Class Form1

End Class

⑤NuGet を用いてOpenCvSharp を導入する方法は、Visual BasicOpenCVで説明した通りです。OpenCvSharp4.Windows とOpenCvSharp4.Extension をインストールする必要があります。

⑥フォームのPaint イベントに対応するメソッドを定義します。プロパティのイベントを選択し、Paint 欄をダブルクリックします。すると、Paint イベントに対応したメソッドが定義され、そのソースファイルの部分へカーソルが表示されます。

⑦Paint イベントに対応するメソッドを記述します。

以降に、最終のソースリストを示します。

Imports OpenCvSharp
Imports OpenCvSharp.Extensions

Public Class Form1
    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
        Dim rows = 200, cols = 300
        Dim img As New Mat(rows, cols, MatType.CV_8UC3, Scalar.Cyan)

        img.Line(New Point(10, 10),                     ' pt1
                 New Point(cols - 10, rows - 10),       ' pt2
                                        Scalar.Blue)    ' color

        ClientSize = New Drawing.Size(cols, rows)
        Using myGraphics As Graphics = Graphics.FromHwnd(Me.Handle)
            Using bmp As Bitmap = Extensions.BitmapConverter.ToBitmap(img)
                myGraphics.DrawImage(bmp, 0, 0)
            End Using
        End Using
    End Sub
End Class

このプログラムはImports OpenCvSharp を指定しているため、OpenCvSharp のNamespace を明示的に指定する必要はありません。ただし、OpenCvSharp と.NET でクラス名などが衝突する場合は、どちらであるか明示してください。たとえば、SizeはOpenCvSharp とSystem.Drawing の両方で定義されているため、このようなときは、どちらのSizeであるか明示しなければなりません。
フォームのPaint イベントにOpenCV 対応のコードを記述したため、フォームを表示する必要があるたびに本メソッドへ制御が渡ります。
Mat オブジェクトは、そのままではフォームに表示できません。このためMat オブジェクトを、いったんBitmap オブジェクトへ変換します。Mat オブジェクトをBitmap オブジェクトへ変換すると、さまざまなコントロールへ画像を表示することが可能となります。
本例は、Using を使用し、Bitmap オブジェクトとGraphics オブジェクトの寿命を管理しています。しかし、この程度のリソースであれば、リソースの寿命管理は.NET へ任せても構わないでしょう。このため、Using を使用せず、普通に記述しても構いません。
また、

    Using bmp As Bitmap = Extensions.BitmapConverter.ToBitmap(img)
        myGraphics.DrawImage(bmp, 0, 0)
    End Using

は、

    myGraphics.DrawImage(img.ToBitmap, 0, 0)

と記述しても良いでしょう。
本ブログでは、基本的にExtensions.BitmapConverter.ToBitmapメソッドを使ってMatオブジェクトをBitmapオブジェクトへ変換します。

実行例

ここまで完了すると、以降は一般的な.NET 対応のVisual BasicWindows フォームアプリと同じです。ビルドして実行した例を示します。プログラムを起動すると、以降に示すウィンドウが現れます。

以上で完了です。