IC Imaging Control (.NET C#/Visual Basic)

  • サンプルプログラムトップページ
  • デバイスのオープンとハンドリング
    • C# VB.NET カメラの映像を既存のアプリケーションに組み込む方法
    • C# VB.NET デバイスを開く
    • C# VB.NET デバイスの開閉
    • C# VB.NET ダイアログボックスを使用してデバイスを開く
    • C# VB.NET 複数のデバイスを開く
    • C# VB.NET デバイスのシリアル番号を読み取る
    • C# VB.NET ICImagingControlの標準プロパティダイアログの使用
    • C# VB.NET デバイスプロパティ設定の保存と復元
  • ライブ表示
    • C# VB.NET ライブ表示のリサイズ
    • C# VB.NET フルスクリーン表示
    • C# VB.NET 十字マークのオーバーレイ
    • C# VB.NET WFPでvideoWindowを使ったビデオ表示
  • フレームフィルタ
    • C# VB.NET 低輝度、高輝度ピクセルの強調 その1
    • C# VB.NET 低輝度、高輝度ピクセルの強調 その2
  • ライブ表示とマルチプロセス
    • C# VB.NET ライブ表示のみ
    • C# VB.NET 静止画保存
    • C# VB.NET 任意のタイミングで画像処理と静止画保存を同時に処理
    • C# VB.NET 録画しながら任意のタイミングで静止画保存
    • C# VB.NET 全フレームリアルタイム画像処理しながら
             NG判定を静止画保存
    • C# VB.NET 全フレームリアルタイム画像処理しながら
             NG判定を静止画保存、同時に録画
  • イメージの取得
    • C# VB.NET イメージデータの取得
    • C# VB.NET 静止画ファイル保存(BMP)
    • C# VB.NET 静止画ファイル保存(JPEG)
    • C# VB.NET 静止画ファイルの連番保存
    • C# VB.NET カメラ画像保存&FTPで任意のサーバーに転送する
    • C# VB.NET リングバッファを使用したイメージシーケンスの取得と再生
    • C# VB.NET 静止画とAVI動画保存
    • C# VB.NET メモリーレコーディング
             (高速カメラで撮影した現象をRAMメモリー領域に保存)
    • C# VB.NET ソフトウェアトリガーで画像を表示・保存
    • C# VB.NET 録画時間を指定したAVIファイル保存
    • C# VB.NET 外部トリガーで録画の開始
    • C# VB.NET 取得したイメージの輝度値をCSV形式で出力する
             (16bit対応)
  • 画像処理
    • C# VB.NET イメージデータへのアクセス
    • C# VB.NET コントラストの強調 - Part 1
    • C# VB.NET コントラストの強調 - Part 2
    • C# VB.NET コントラストの強調 - Part 3
    • C# VB.NET レーザーポインタの位置を特定する
    • C# VB.NET OpenCVの画像処理
             (アナログタコメーターのデジタル化)
    • C# VB.NET AIモデルを使ったリアルタイム処理
  • Version 3.5サンプル
    • C# VB.NET 関心領域の画像更新
      Advanced Image Processing
    • C# VB.NET 2値化
      Binarization
    • C# VB.NET 明るさの調整
      BrightnessProperty
    • C# VB.NET 動画保存(MediaStreamSink)
      Capturing a Video File
    • C# VB.NET 動画保存(AviStartCapture)
      Capturing an AVI File
    • C# VB.NET 共通ファイル
      Common
    • C# VB.NET オーバーレイの作成
      Creating an Overlay
    • C# VB.NET デモアプリ
      demoapp
    • C# VB.NET VCDプロパティ:GPIOプロパティ編
      DigitalIO
    • C# VB.NET コールバック関数を使ってバッファを表示させる
      Display Buffer
    • C# VB.NET フィルターの適用
      Filter Inspector
    • C# VB.NET 静止画をキャプチャし保存する
      Grabbing an Image
    • C# VB.NET イメージバッファの輝度値を読み込み、輝度反転処理を施す
      Image Processing
    • C# VB.NET VCDプロパティ:全プロパティ一覧を表示する編
      List VCDProperties
    • C# VB.NET デバイス設定ダイアログの作成
      Making Device Settings
    • C# VB.NET イメージバッファにアクセスする
      Pixelformat
    • C# VB.NET コーデックのプロパティを保存する
      Saving Codec Properties
    • C# VB.NET スクロールとズーム
      croll And Zoom
    • C# VB.NET VCDプロパティ:露光とゲイン編
      StandardProperties
    • C# VB.NET VCDプロパティ:ストロボアウト編
      Strobe
    • C# VB.NET VCDプロパティ:
             プロパティダイアログ画面のカスタマイズ編
      VCD Property Page
    • C# VB.NET VCDプロパティ:明るさとホワイトバランス編
      VCD Simple Property
    • C# VB.NET VCDプロパティ:オートフォーカス編
    • C# VB.NET デバイスの再接続方法とフレーム落ちの確認
  • リンク集

    ICImagingControl WEB APIリファレンスマニュアル/サンプルプログラム

    :日本語対応済み :日本語化準備中
    開発言語 APIリファレンスマニュアル サンプルプログラム
    C 4.0
    ()
    - - 4.0
    ()
    - -
    C++ 4.0
    ()
    3.5
    ()
    3.4
    ()
    4.0
    ()
    3.5 3.4
    ()
    C#/VB.NET 4.0
    ()
    3.5
    ()
    3.4
    ()
    4.0
    ()
    3.5
    ()
    3.4
    ()
    Python 4.0
    ()
    3.5 3.4
    ()
    4.0
    ()
    3.5 3.4
    ()

ソフトウェアトリガーで画像を表示・保存

概要

このサンプルは、ソフトウェアトリガーで画像を保存する方法を示しています。

サンプルプログラム

Software IC Imaging Control 3.5, Visual Studio™ 2019
サンプル(C#) SoftwareTrigger_cs_3.5.zip
サンプル(VB.NET) SoftwareTrigger_vb_3.5.zip

サンプルツールの外観

icImagingControl1.LiveDisplayDefault = false;
icImagingControl1.DeviceTrigger = true; //トリガーモードオン

icImagingControl1.LiveCaptureLastImage = false; // Do not save an image on live stop.
icImagingControl1.LiveDisplay = false; //ライブ画像を表示しない
icImagingControl1.Sink = new FrameQueueSink(ShowBuffer, MediaSubtypes.RGB32, 5);


icImagingControl1.LiveStart();//ライブスタート

IcImagingControl1.LiveDisplayDefault = False
IcImagingControl1.DeviceTrigger = True 'トリガーモードオン

IcImagingControl1.LiveCaptureLastImage = False  ' Do Not save an image On live Stop.
IcImagingControl1.LiveDisplay = False 'ライブ画像を表示しない

IcImagingControl1.Sink = New TIS.Imaging.FrameQueueSink(Function(img)
                                                            Return ShowImage(img)
                                                        End Function, New TIS.Imaging.FrameType(TIS.Imaging.MediaSubtypes.RGB32), 5)
                                                        

DeviceTriggerでトリガーモードをオンにし、ライブスタートします。トリガーモード中、外部トリガー信号あるいはソフトウェアトリガー信号を入力しない限りカメラは画像を転送しません。SingleSnapなどを使用して順次処理をした場合、トリガーを待つ間ずっとプログラム処理が待ち状態になってしまうため、ShowImageなどのコールバック関数を使用することを推奨しています。

下記のような手順でソフトウェアトリガーを入力することができます。

Software TriggerのVDCPropertyのPushメソッドを使用するために、FindInterfaceメソッドの引数にインターフェースパスをパラメーターとして渡しSoftware Triggerプロパティにアクセスします。 ソフトウェアトリガーが入力されたタイミングでライブ表示、画像を取得、画像保存などのキャプチャモード(ShowImageイベント)を有効にするために、FrameQueueSinkをsinkに設定します。このモードでは自動的に全てのフレームがリングバッファにコピーされるようになります。また、 リングバッファへのフレームのコピーが完了するごとにShowImageのコールバック関数に送られるようになります。 また、ライブストップした最後のフレームを保存し表示しないためにオフにし、ShowImageのコールバック関数でLiveDisplayするようにするためにライブ画像を明示的にオフにします。

ワンポイントアドバイス

PC側でフレームを取得する速度よりもカメラの設定フレームレートを速く設定してください。 例えば、1秒間に50回トリガーを入力する場合にはカメラの設定フレームレートを50fps以上にする必要があります。

 SoftwareTrigger = icImagingControl1.VCDPropertyItems.Find<VCDButtonProperty>(VCDGUIDs.VCDID_TriggerMode,
                                VCDGUIDs.VCDElement_SoftwareTrigger);//宣言

ExposureMode = icImagingControl1.VCDPropertyItems.Find<VCDMapStringsProperty>(VCDGUIDs.VCDID_TriggerMode,
                                VCDGUIDs.VCDElement_Trigger_ExposureMode);//

//トリガーDelay宣言
TriggerDelay = icImagingControl1.VCDPropertyItems.Find<VCDAbsoluteValueProperty>(VCDGUIDs.VCDID_TriggerMode,
                                VCDGUIDs.VCDElement_TriggerDelay);

//DebounceTime宣言;
TriggerDebounceTime = icImagingControl1.VCDPropertyItems.Find<VCDAbsoluteValueProperty>(VCDGUIDs.VCDID_TriggerMode,
                                VCDGUIDs.VCDElement_TriggerDebounceTime);

//MaskTime宣言
TriggerMaskTime = icImagingControl1.VCDPropertyItems.Find<VCDAbsoluteValueProperty>(VCDGUIDs.VCDID_TriggerMode,
                                VCDGUIDs.VCDElement_TriggerMaskTime);

//NoiseSuppressionTime宣言
TriggerNoiseSuppressionTime = icImagingControl1.VCDPropertyItems.Find<VCDAbsoluteValueProperty>(VCDGUIDs.VCDID_TriggerMode,
                                VCDGUIDs.VCDElement_TriggerNoiseSuppressionTime);//トリガーDelay宣言;

//BurstCount宣言;
TriggerBurstCount = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_TriggerMode,
                                VCDGUIDs.VCDElement_Trigger_BurstCount);

//BurstInterval宣言;
TriggerBurstInterval = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_TriggerMode,
                                 Guid.Parse("A9715AB3-69AE-454D-8DF5-7E06D87C109C"));


//トリガーOverlap宣言
TriggerOverlap = icImagingControl1.VCDPropertyItems.Find<VCDMapStringsProperty>(VCDGUIDs.VCDID_TriggerMode,
                                Guid.Parse("7685BF04-C9C9-4AE2-BA69-1278B77F97F6"));

SoftwareTrigger = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                        VCDGUIDs.VCDElement_SoftwareTrigger, VCDGUIDs.VCDInterface_Button)




ExposureMode = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                    Guid.Parse("B6E013CA-76C7-4DDD-9AC8-A17E07C5E3F1"),
                                    VCDGUIDs.VCDInterface_MapStrings)

'//トリガーDelay宣言
TriggerDelay = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                    VCDGUIDs.VCDElement_TriggerDelay,
                                    VCDGUIDs.VCDInterface_AbsoluteValue)

'//DebounceTime宣言;
TriggerDebounceTime = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                    VCDGUIDs.VCDElement_TriggerDebounceTime,
                                    VCDGUIDs.VCDInterface_AbsoluteValue)

'//MaskTime宣言
TriggerMaskTime = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                    VCDGUIDs.VCDElement_TriggerMaskTime,
                                    VCDGUIDs.VCDInterface_AbsoluteValue)
'//NoiseSuppressionTime宣言
TriggerNoiseSuppressionTime = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                    VCDGUIDs.VCDElement_TriggerNoiseSuppressionTime,
                                    VCDGUIDs.VCDInterface_AbsoluteValue)

'//BurstCount宣言;
TriggerBurstCount = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                    Guid.Parse("B4109964-77E4-4AF3-ACA8-45BBAA861B5C"),
                                    VCDGUIDs.VCDInterface_Range)

'//BurstInterval宣言;
TriggerBurstInterval = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                    Guid.Parse("A9715AB3-69AE-454D-8DF5-7E06D87C109C"),
                                    VCDGUIDs.VCDInterface_Range)


'//トリガーOverlap宣言
TriggerOverlap = IcImagingControl1.VCDPropertyItems.Find(VCDGUIDs.VCDID_TriggerMode,
                                    Guid.Parse("7685BF04-C9C9-4AE2-BA69-1278B77F97F6"),
                                    VCDGUIDs.VCDInterface_MapStrings)

トリガーで使用するプロパティ(Debounce Time , Trigger mak Time, Delay, Burst Count等)の設定は下記のように、それぞれのVCDプロパティのインターフェースを取得し、値やプロパティの自動設定などのエレメントを調節してください。

※カメラによって実装されている機能とされていない機能があります。

private void Button1_Click(object sender, EventArgs e)
{
    SoftwareTrigger.Push(); //ソフトウェアトリガー入力   

}
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SoftwareTrigger.Push()
End Sub

Pushメソッドを呼び出すことで簡単にソフトウェアトリガーを入力することができます。

private FrameQueuedResult ShowBuffer(IFrameQueueBuffer buffer)
{

    icImagingControl1.DisplayImageBuffer(buffer);

    //バッファの内容をJPEGファイルとしてディスクに保存します。
    string filename = String.Format("test{0}.jpg", counter);
    buffer.SaveAsJpeg(filename, 70);
    counter++;
    return FrameQueuedResult.ReQueue;
}
Function ShowImage(img As TIS.Imaging.IFrameQueueBuffer)

    Try
        IcImagingControl1.DisplayImageBuffer(img)
        '//バッファの内容をJPEGファイルとしてディスクに保存します
        Dim filename As String = String.Format("test{0}.jpg", counter)
        img.SaveAsJpeg(filename, 70)
        counter = counter + 1


    Catch ex As System.Exception
        System.Diagnostics.Trace.WriteLine(ex.Message)
    End Try

    Return TIS.Imaging.FrameQueuedResult.ReQueue
End Function

ソフトウェアトリガーを入力したタイミングでリングバッファへのフレームのコピーが完了し、ShowImageのコールバック関数が呼び出されます。バッファはICImagingControl.DisplayImageBufferを呼び出すことで表示することができます。

また、SaveAsJpegメソッドでバッファをJPEG形式などで保存することもできます。

ワンポイントアドバイス

ShowBufferはカメラからのフレームを取得する度毎に呼び出されます。
上記の例では、フレームを取得する度毎にJPEG保存をしていますが、処理時間がかかるロジックになりますとShowBufferの処理はシングルスレッドになっておりますので、ShowBufferの処理が終わらない限りカメラから送られてくるフレームはすべて無視されてしまいます。
なお、DriverFrameDropInformationDataクラスを使うことでフレーム落ちしたかどうか確認することができます。

デバイスの再接続方法とフレーム落ちの確認
IC Imaging Control Ver3.5(C#/VB.NET) サンプルプログラム

▲ このページの先頭に戻る

Copyright © ARGO Corporation. All Rights Reserved.