静止画をキャプチャし保存する
概要
このサンプルはライブストリームより静止画をキャプチャしBMPファイルとして保存する方法です。
アプリケーションがスナップショットを必要とする場合、また定期的/不定期的に画像データへアクセスしたい場合にはFrameSnapSinkのクラスを使った方法が有効ですが、入力した画像に対して都度画像処理が必要な場合にはFrameQueueSinkをお使いください(下記のサンプルを参考してください)。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | grabbing_an_image_cs_3.5.zip |
サンプル(VB.NET) | grabbing_an_image_vb_3.5.zip |
実行結果
Visual Studioのプログラム上ではすでにボタンの設置や関数は定義済ですので、IC Imaging Contorl3.5をインストールされていれば、実行ボタンだけですぐにデバッグで動作確認することができます。
画面にあるそれぞれのボタンなどのコントローラの機能は下記の通りです。
[Start Live]ボタン | ライブストリームを開始します。 |
---|---|
[Stop Live]ボタン | ライブストリームを停止します。 |
[Save]ボタン | 表示している画像を静止画保存します。 |
初期設定
private void Form1_Load(object sender, EventArgs e)
{
if( !icImagingControl1.LoadShowSaveDeviceState("lastSelectedDeviceState.xml") )
{
MessageBox.Show("No device was selected.", "Grabbing an Image", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
}
// カメラの設定した解像度に合わせて表示画面を変更
icImagingControl1.LiveDisplayDefault = false;
icImagingControl1.LiveDisplaySize = icImagingControl1.Size;
cmdStartLive.Enabled = true;
cmdStopLive.Enabled = false;
cmdSaveBitmap.Enabled = false;
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IcImagingControl1.DeviceValid() Then
IcImagingControl1.ShowDeviceSettingsDialog()
If Not IcImagingControl1.DeviceValid Then
MsgBox("No device was selected.", MsgBoxStyle.Information, "Grabbing an Image")
Me.Close()
End If
End If
' カメラの設定した解像度に合わせて表示画面を変更
IcImagingControl1.LiveDisplayDefault = False
IcImagingControl1.LiveDisplaySize = IcImagingControl1.Size
cmdStartLive.Enabled = True
cmdStopLive.Enabled = False
cmdSaveBitmap.Enabled = False
End Sub
フォームロードするタイミングの処理内容です。
LoadShowSaveDeviceStateメソッドにてデバイスを割り当て、LiveDisplaySizeプロパティを使用することで、カメラの設定した解像度に合わせて表示画面を変更しています。
[Start Live]ボタンをクリックした時の動作
private void cmdStartLive_Click(object sender, EventArgs e)
{
icImagingControl1.Sink = new TIS.Imaging.FrameSnapSink();
icImagingControl1.LiveStart();
cmdStartLive.Enabled = false;
cmdStopLive.Enabled = true;
cmdSaveBitmap.Enabled = true;
}
Private Sub cmdStartLive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStartLive.Click
IcImagingControl1.Sink = New TIS.Imaging.FrameSnapSink()
IcImagingControl1.LiveStart()
cmdStartLive.Enabled = False
cmdStopLive.Enabled = True
cmdSaveBitmap.Enabled = True
End Sub
[Start Live]ボタンをクリックした時のイベントハンドラーです。
LiveStartメソッドを開始する前にFrameSnapSinkメソッドでビデオストリームからフレームを取得するためのSinkタイプを作成します。
シンクとは画像取り込みカメラより送られて来るフレームを受け取り、そこからFrameHandlerSink.ImageBuffersコレクションにコピーするオブジェクトを指します。
[Stop Live]ボタンをクリックした時の動作
private void cmdStopLive_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStop();
cmdStartLive.Enabled = true;
cmdStopLive.Enabled = false;
cmdSaveBitmap.Enabled = false;
}
Private Sub cmdStopLive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStopLive.Click
IcImagingControl1.LiveStop()
cmdStartLive.Enabled = True
cmdStopLive.Enabled = False
cmdSaveBitmap.Enabled = False
End Sub
[Stop Live]ボタンをクリックした時のイベントハンドラーです。
LiveStopメソッドだけで停止することができます。
[Save]ボタンをクリックした時の動作
private void cmdSaveBitmap_Click( object sender, EventArgs e )
{
// FrameSnapSinkを呼び出し
TIS.Imaging.FrameSnapSink snapSink = icImagingControl1.Sink as TIS.Imaging.FrameSnapSink;
// 1枚のイメージを取得。Sinkに入る次のフレームを5秒間待つ
TIS.Imaging.IFrameQueueBuffer frm = snapSink.SnapSingle(TimeSpan.FromSeconds(5));
// 画像を保存
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "bmp files (*.bmp)|*.bmp|All files (*.*)|*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.RestoreDirectory = true;
if( saveFileDialog1.ShowDialog() == DialogResult.OK )
{
frm.SaveAsBitmap(saveFileDialog1.FileName);
}
}
Private Sub cmdSaveBitmap_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSaveBitmap.Click
If IcImagingControl1.LiveVideoRunning Then
Try
Dim imageSink As TIS.Imaging.FrameSnapSink = IcImagingControl1.Sink
' 1枚のイメージを取得。Sinkに入る次のフレームを5秒間待つ
Dim image As TIS.Imaging.IFrameQueueBuffer = imageSink.SnapSingle(TimeSpan.FromSeconds(5))
' 画像を保存
Dim saveFileDialog1 As SaveFileDialog = New SaveFileDialog()
saveFileDialog1.Filter = "bmp files (*.bmp)|*.bmp|All files (*.*)|*.*"
saveFileDialog1.FilterIndex = 1
saveFileDialog1.RestoreDirectory = True
If saveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
'画像を保存する
image.SaveAsBitmap(saveFileDialog1.FileName)
End If
Catch
MessageBox.Show("Snap Image failed, timeout occurred.")
End Try
End If
End Sub
[Save]ボタンをクリックした時のイベントハンドラーです。
静止画保存機能が組み込まれたSinkタイプのFrameSnapSinkを使用しています。
IFrameQueueBufferはイメージバッファへのインターフェースでFrameQueueSinkとFrameSnapSinkで、イメージバッファを参照する際に使用します。
SnapSingleメソッドを使うことで、カメラから送られた新しい画像が取得されるのを待ち、取得されたらIFrameQueueBufferにその画像を返しますので、バッファを気にすることなく画像を簡単に取得できます。
下記のAPIリファレンスマニュアルにもその他関数などの説明があります。
プログラマーズガイド:静止画をキャプチャし保存する
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル