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
    ()

2値化

概要

ImagingControlには標準でFrameFilterメソッドが用意されています。 フィルタインターフェイスを提供するクラスでフィルタのパラメータにアクセスしたり、設定ダイアログを表示したり、フィルタの設定を保存したりするためのメソッドが含まれていますがFrameFilterでは2値化処理などは用意されておりません。
ここでは2値化処理をフィルタ機能として拡張するための方法について説明しています。このサンプルはデバイスから取得した輝度値に対して、Thresholdスライダーで設定した閾値よりも下回っていたら白色に、上回っていたら黒色にリアルタイムで変換するプログラムコードです。

Visual Studioのプログラム上ではすでにボタンの設置や関数は定義済ですので、IC Imaging Contorl3.5をインストールされていれば、実行ボタンだけですぐにデバッグで動作確認することができます。
画面にあるそれぞれのボタンなどのコントローラの機能は下記の通りです。

サンプルプログラム

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

実行結果

Binarization(2値化)

[Properties]ボタン デバイスプロパティのダイアログ画面を表示
[Device]ボタン デバイスを選択するダイアログ画面を表示
[Threshold]スライダー 閾値の設定
[Binarization]チェックボックス ライブ画像にフィルタをかける

2値化フィルタのクラスの定義

フレームフィルタを作成するためには、以下の3つのメソッドを最低限実装する必要があります。FrameFilterImplインターフェースを継承したBinarizationFilterクラスを定義し、下記の3つのメソッドをオーバーライドして2値化処理を実装していきます。

Transform ソースにあるフレームを変換、または送り先のIFrameにコピーする際に呼び出されます。
GetSupportedInputTypes 変換フィルタが入力タイプとして何をサポートしているかを取得するのに呼び出されます。
GetTransformOutputTypes 利用可能な出力タイプをリクエストするために呼び出されます。変換出力タイプは優先順位をつけた上で並べられます。その機能や次のフィルタの入力タイプに合わせて選択されます。
public class BinarizationFilter : FrameFilterImpl

変換フィルタを実装するために必要なFrameFilterImplの基底クラスを継承したクラスBinarizationFilter を定義します。

カラーフォーマットをチェックするオーバーライド関数

public override void  GetSupportedInputTypes( System.Collections.ArrayList frameTypes )
{
     // このフィルタは Y800 (8bitのグレースケール画像)にのみ作用
     frameTypes.Add( new FrameType(MediaSubtypes.Y800 ) );
}

GetSupportedInputTypesメソッド内のArrayListにはFrameTypeオブジェクトが格納されていて、フレームの高さや幅などがすでに存在します。

FrameTypeクラス
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル

2値化フィルタを適用する前に、フレームフィルタでカラーフォーマットをチェックするために、FrameTypeを追加しています。この処理によって、画像取り込みデバイスのビデオフォーマットが変更された時、その画像データはフレームフィルタに渡される前の段階で自動的に変換されます。

フレームタイプを格納するオーバーライド関数

public override bool  GetTransformOutputTypes( FrameType inType, System.Collections.ArrayList outTypes )
{
     // 画像タイプの変更はしない  output = input
     outTypes.Add( inType );
     return true;
}

GetTransformOutputTypesメソッドはArrayList outTypesにフレームタイプを格納していきます。指定したフレームタイプによって指定された入力フレームタイプからフィルタが作り出せます。2値化フィルタはフレームタイプやサイズを変えることはしないため、リストには単に入力タイプを挿入します。

2値化処理するためのオーバーライド関数

public override bool  Transform( IFrame src, IFrame dest )
{
     //c#でポインタを使うためブロックの宣言
     unsafe
     {
         // 送り先のフレームが利用可能かどうかをチェック
         if ( dest.Ptr == null ) return false;
         //
         // ユーザーはbeginParamTransfer/endParamTransferにも
         // パラメータアクセスを入れる必要があるため
         // beginParamTransfer/endParamTransfer が各メンバ変数からの
         // 値に矛盾がないことを確認。
         BeginParameterTransfer();

         // メンバ変数を関数のスタックにコピーしてsetThreshold()等への
         // 並行呼び出しによる上書きを防ぐ
         int threshold = _threshold;
         bool enabled = _enabled;

         EndParameterTransfer();

         byte* pIn = src.Ptr;
         byte* pOut = dest.Ptr;
         // 2値化が有効化どうかをのチェック
         if ( enabled )
         {
             // 入力バッファ内の各バイトに対してしきい値以上かどうかをチェック
             // 画像データの1フレームを保持するのに必要なバイト数を取得
             int bufferSize = src.FrameType.BufferSize;
             while ( bufferSize-- > 0 )
             {

                 if (*pIn++ >= threshold)
                 {
                     *pOut++ = 255;
                 }
                 else
                 {
                     *pOut++ = 0;
                 }
             }
         }
         else
         {
             // 2値化は無効: 画像データをそのままコピー
             dest.CopyFrom( src );
         }
     }
     return true;
}

フレームごとに2値化処理するための関数です。 Transformメソッドはユーザーインターフェースとは別のスレッドで実行されるので、m_bEnabledと m_thresholdのメンバ変数へのアクセスするために、アプリケーションプログラムによる並行処理が起こらないようにローカル変数を定義しておく必要があります。BeginParameterTransferでパラメータにアクセス開始し、閾値の変数(threshold)と有効無効化の変数(enabled)の取得し、EndParameterTransferでアクセス終了の宣言をすることで、フィルタのパラメータにアクセスすることができます。その後、2値化処理は各ピクセルの輝度値を閾値と比較し、輝度値が設定した閾値よりも大きければそのピクセルの値を黒(輝度値:255)に設定し、逆であれば白(輝度値:0)に設定するようにします。

コンストラクタの実装

public BinarizationFilter()
{
     //フィルタ機能(2値化処理)をオン、オフ
     AddBoolParam( "enable", new SetBoolParam( setEnable ), new GetBoolParam( getEnable ) );
     //フィルタ機能(2値化処理)に閾値を反映・調整
     AddIntParam( "threshold", new SetIntParam( setThreshold ), new GetIntParam( getThreshold ) );
}

上記で設定したGetSupportedInputTypesメソッド, GetTransformOutputTypesメソッド, Transformメソッドの3つのオーバーライトしたフィルタメソッドにアクセスするために、SetBoolParameterやGetIntParameterなどFrameFilterの汎用的機能を使ってコンストラクタ(クラスインスタンス生成時に実行されるメソッド)を実装していきます。

SetBoolParam 2値化を有効化・無効化を設定する関数
GetBoolParameter 2値化を有効化・無効化の値Bool値を取得する関数
SetIntParameter 2値化で使用する閾値を設定する関数
GetIntParameter 値化で使用する閾値を取得する関数

AddBoolParam、AddIntParamに対してパラメータ変換を有効化させるためにデリゲートを下記のように定義する必要があります。

void setEnable( bool enable )
{
     _enabled = enable;
}
bool getEnable()
{
     return _enabled;
}
void setThreshold( int threshold )
{
     _threshold = threshold;
}

int getThreshold()
{
     return _threshold;
}

BinarizationFilterの実装

private void Form1_Load( object sender, EventArgs e )
{
    if( !icImagingControl1.LoadShowSaveDeviceState("lastSelectedDeviceState.xml") )
    {
        MessageBox.Show("No device was selected.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.Close();
        return;
    }


    // overlay bitmap を無効にする
    icImagingControl1.OverlayBitmapPosition = TIS.Imaging.PathPositions.None;

    // フレームフィルタ実装のインスタンスを作成
    BinarizationFilter binFilterImpl = new BinarizationFilter();

    // 新しくクラス実装をしたFrameFilter オブジェクトを作成
    _frameFilter = TIS.Imaging.FrameFilter.Create( binFilterImpl );

    // FrameFilterをディスプレイフレームフィルタとしてセット
    icImagingControl1.DisplayFrameFilters.Add( _frameFilter );

    // ライブモードの開始
    icImagingControl1.LiveStart();

    //フィルタパラメータを変更処理開始する
    _frameFilter.BeginParameterTransfer();

    //パラメータの設定 Bool型
    chkEnable.Checked = _frameFilter.GetBoolParameter( "enable" );

    //閾値のパラメータの設定
    sldThreshold.Minimum = 0;
    sldThreshold.Maximum = 255;
    sldThreshold.Value = _frameFilter.GetIntParameter( "threshold" );
    lblThreshold.Text = sldThreshold.Value.ToString();
    sldThreshold.Enabled = chkEnable.Checked;
    lblThreshold.Enabled = chkEnable.Checked;

    //フィルタパラメータを変更終了する
    _frameFilter.EndParameterTransfer();
}

上記はFormが起動したときに呼び出されるイベント関数です。BinarizationFilterを使うためにフィルタを使う前準備としてインスタンスを作成し、FrameFilter.Createに渡します。その後、先に設定したオーバーロードを呼び出すため、FrameFilterImplオブジェクトを継承したFrameFilterオブジェクトを作成します。これによって、ダイアログクラスのメンバ変数内にFrameFilterオブジェクトへの参照し、フィルタのパラメータにアクセスすることができますので、ICImagingControl.DeviceFrameFilters, ICImagingControl.DisplayFrameFiltersに拡張した機能である2値化処理を適用させることができます。

シンクタイプで定義したFrameFilterをディスプレイパスに設定するために、ICImagingControl.DisplayFrameFilters.Addで2値化処理の実装をラッピングしたFrameFilter オブジェクトをDisplayFrameFiltersのFrameFilters コレクションに追加します。

上記のように設定することでライブモードが開始されると、IC Imaging Controlによってライブ表示される前の画像が2値化されるようになります。

チェックボックスへの実装

private void chkEnable_CheckedChanged( object sender, EventArgs e )
{
    //フレームフィルタのパラメータへアクセス開始
    _frameFilter.BeginParameterTransfer();
    //パラメータセットする
    _frameFilter.SetBoolParameter( "enable", chkEnable.Checked );
    sldThreshold.Enabled = _frameFilter.GetBoolParameter( "enable" );
    lblThreshold.Enabled = _frameFilter.GetBoolParameter( "enable" );
    //フレームフィルタのパラメータへアクセス終了
    _frameFilter.EndParameterTransfer();
}

チェックボックスにチェックを入れた時のイベント関数です。フレームフィルタのパラメータへアクセスするためにBeginParameterTransferメソッドでフレームフィルタのパラメータへアクセス開始し、BinarizationFilterクラスで定義したSetBoolParameterメソッドで2値化処理を適用し、フレームフィルタのパラメータへアクセス終了することで2値化処理を適用することができます。

下記のAPIリファレンスマニュアルにもその他関数などの説明があります。

プログラマーズガイド:フレームフィルタの記述: 2値化処理
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル

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

Copyright © ARGO Corporation. All Rights Reserved.