VB.NET でOpenCVでカメラ、シャッタ、保存 その1

openCVSharp4が結構ネットに上がっているがC#やpyhtonばかりでvb.netが見あたらないので
作ってみた


動作
 1.スタートでカメラから画像を60フレーム程度で取り込み表示
 2.シャッターで表示中の画像を一時保存
 3.保存でダイアログを開いて指定のフォルダに保存

form1 

form上に ボタンを4つ combboxを一つ picutureboxを二つ
timer1を一つ (本来はroot処理でwaitkeyで止まるはずだがなぜかvbでは止まらない)

ツール>>NetGetパッケージマネージャー>>ソルーションから
下記の三つをインストール
OpenCVSharp4
OpenCVSharp4 Extensions
OpenCVSharp4 RunTime.win
これに必要な他の、モジュールも取り込まれる
なおNetFrameWorkのバージョンで動作しない事があるので注意

まずはVideoCaptureの定義 captureならエラーになるので注意

Private capture1 As VideoCapture = Nothing
Private flame As Mat = Nothing

loadでpicturebox1,picturebox2の初期化と接続カメラの定義
複数ある場合はこの方法でも可能


‘複数のカメラの検索
‘For i = 0 To 3
‘ capture = New VideoCapture()
‘ capture.Open(i)
‘ If capture.IsOpened() = False Then
‘ Else
‘ ComboBox1.Items.Add(i)
‘ End If
‘Next

起動は

capture1 = New VideoCapture()
capture1.Open(CInt(Mid(ComboBox1.Text, 1, 1)))
If capture1.IsOpened() = False Then
   MsgBox(“capture initialization failed”, vbInformation)
End If
PictureBox1.Visible = True
PictureBox2.Visible = False

Timer1.Interval = 33 ’ 60フレーム
Timer1.Start()

本当はループでカメラからの画像を取り込みたいけど
flame = New Mat()
capture1.Read(flame)
If flame.Empty() Then
Exit Sub
End If
If flame.Size().Width > 0 Then
‘PictureBoxに表示 MatをBitMapに変換
PictureBox1.Image = BitmapConverter.ToBitmap(flame)
End If

シャッタを押せばタイマーを停止して画像と取り込み

If flame Is Nothing Then
Return
End If
PictureBox1.Visible = False
PictureBox2.Visible = True
‘//PictureBoxに表示 MatをBitMapに変換
PictureBox2.Image = BitmapConverter.ToBitmap(flame)
Timer1.Stop()

ダイアログを開いてファイル名で保存

終了は

Timer1.Stop()
If capture1 IsNot Nothing Then
capture1.Dispose()
End If
PictureBox1.Image = Nothing
PictureBox2.Image = Nothing
m_END = True
Me.Close()

これで完了、