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

リングバッファを使用したイメージシーケンスの取得と再生

概要

ICImagingControlでリングバッファを構成し、取得した複数のフレームを表示するサンプルです。

サンプルプログラム

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

サンプルツールの外観

このサンプルでは、キャプチャボタンが押された時点から3秒前まで遡った全イメージフレームを保持します。その後、ユーザーは自動または手動で保持されたフレームを表示する事ができます。イベントレコーダーなど、様々な用途で利用する事ができるメソッドです。

このサンプルの主な構成は以下となります。

ImageBuffersから迅速にデータを引き出す方法

FrameQueueSinkにため込んだリングバッファにアクセスする方法

グローバル変数を宣言

// この属性は、IC Imaging Controlウィンドウ画面に合うようにライブ表示を拡大縮小するかどうかを制御します
private bool m_bFitImageToWindow = true;
// シンク関数を用意
private SinkListener _sinkListener = new SinkListener();
FrameQueueSink _sink;

// 3秒間キャプチャする(フレームレートの三倍分フレームを取得する)
private int _FramesToCapture = 0;

// キャプチャしたイメージを格納するリングバッファ
private IFrameQueueBuffer [] _bufferlist;

FrameQueueSinkクラスを使用するために_sinkを定位置に、なおかつFrameQueueSinkクラスでのコールバック関数を使用するために_sinkListenerもグローバル変数で宣言が必要となります。
また、取得したフレームをリングバッファに格納するために_bufferlistも宣言しておきます。

private void Form1_Load(object sender, EventArgs e)
{
    icImagingControl1.LoadDeviceStateFromFile("device.xml", true);

    if (m_bFitImageToWindow)
    {
        // ディスプレイのサイズを調整
        icImagingControl1.LiveDisplayDefault = false;
        icImagingControl1.LiveDisplaySize = icImagingControl1.Size;
    }

    // _sinkListenerをベースにシンクを作成
    // Prepareボタンをクリックしたときにリングバッファを取得します。
    _sink = new FrameQueueSink(_sinkListener, MediaSubtypes.RGB32);
    icImagingControl1.Sink = _sink;

    UpdateControls();
}        

フォームロードしたタイミングでシンクをFrameQueueSinkクラスを使うのですが、FrameQueueSinkクラスによって使用されるインターフェースで状態変化や通知や新しいフレームのコールバックを使うためにクラスを定義します。

SinkListenerクラスの定義

class SinkListener : IFrameQueueSinkListener
{
    public void FramesQueued(FrameQueueSink sink)
    {
        if( sink.InputQueueSize == 0)
        {
            sink.QueueBuffer(sink.PopOutputQueueBuffer());
        }
    }

}

IFrameQueueSinkListener
インターフェースを使用するためにクラスを定義します。
InputQueueSizeでキューがからの場合にはPopOutputQueueBuffer を使ってリングバッファからシンクの入力キューに入れます。

[Start Live]ボタンクリックした時

private void StartLiveVideo()
{
    icImagingControl1.LiveStart();
    btnSnapEvent.Enabled = false;
    // フレームレートの3倍(3秒間取得)
    _FramesToCapture = (int)icImagingControl1.DeviceFrameRate * 3;
    // 3 seconds capture time;
    UpdateControls();
}

ライブ開始時にリングバッファに取りためる数を変数_FramesToCapture(フレームレート×3)で計算しておく。

[Prepare]ボタンクリックした時

private void btnPrepareFrameBufferQueue_Click(object sender, EventArgs e)
{
    btnPrepareFrameBufferQueue.Enabled = false;
    if (_bufferlist != null)
    {
        _bufferlist = null;
        GC.Collect();
    }
    _sink.AllocAndQueueBuffers(_FramesToCapture);

    btnSnapEvent.Enabled = true;
}

_bufferlistにデータが残っていればクリアにしてGC.Collect()メソッドで強制的にガベージコレクションを行います。
シンクは、画像をキャプチャするためのバッファをキューに割り当てます。
AllocAndQueueBuffersを使って_FramesToCapture(フレームレート×3)分のリングバッファを割り当てます。

[Snap]ボタンをクリックしたとき

private void btnSnap_Click(object sender, EventArgs e)
{
    btnSnapEvent.Enabled = false;

    System.Threading.Thread.Sleep(1000);

    _bufferlist = _sink.PopAllOutputQueueBuffers();

    if (_bufferlist.Length > 0)
    {
        tbImageIndex.Maximum = _FramesToCapture - 1;
        tbImageIndex.Value = 0;
        pictureBox1.Image = _bufferlist[0].CreateBitmapWrap();
        btnSaveClip.Enabled = true;
    }

    btnPrepareFrameBufferQueue.Enabled = true;
}

さらに1待ってから、キャプチャを停止します。
キャプチャされたリングバッファはシンクから_bufferlistにコピーされます。
Sinkからのコピーされたフレームを取得するためにPopAllOutputQueueBuffersを使用します。最初のバッファのイメージをCreateBitmapWrapを使って画像ボックス(pictureBox1)に引き渡します。

スライドバーを動かしたとき

private void tbImageIndex_Scroll(object sender, EventArgs e)
{
    if (_bufferlist == null)
        return;
    if (tbImageIndex.Value < _bufferlist.Length)
    {
        pictureBox1.Image = _bufferlist[tbImageIndex.Value].CreateBitmapWrap();
        pictureBox1.Update();
    }
}

_bufferlistに保存された画像を表示するには配列_bufferlistにインデックス番号を割り振ることで簡単にリングバッファにアクセスすることができます。

[save]ボタンをクリックしたとき

 private void btnSaveClip_Click(object sender, EventArgs e)
{
    if( saveClipDlg.ShowDialog(this) == DialogResult.OK)
    {
        SaveBufferList(saveClipDlg.FileName);
    }
}

private void SaveBufferList(String FileName)
{
    MFTestSharp.H264Writer writer;

    int BITRATE = 60 * 1000000;

    writer = new MFTestSharp.H264Writer(FileName, _sink.OutputFrameType, (int)icImagingControl1.DeviceFrameRate, BITRATE);
    writer.Begin();


    for (int i = 0; i < _bufferlist.Length; i++)
    {
        writer.Write(_bufferlist[i]);
    }
    writer.End();
}

Microsoft Media Foundationを使ってH264コーデックでビデオファイルを保存します。
H264Writerメソッドをラップしたもので下記の4つの変数を引き渡すことでH264コーデックにて保存することが可能です。

  • FileName(ファイル名)
  • OutputFrameType(解像度)
  • DeviceFrameRate(フレームレート)
  • BITRATE(ビットレート)

ビットレートをH.264で使用される4,000kbps程度としています。
ビットレートは1秒あたりのデータ量となっておりますので、ビットレートは高ければ高いほど、ブロックノイズが減りますがデータ量が重くなるため注意が必要です。

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

Copyright © ARGO Corporation. All Rights Reserved.