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#) find_laser_point_cs_3.5.zip

サンプルツールの外観

このサンプルは取得イメージの中から1か所の赤いレーザーポインタを見つけ、十字マークと座標をオーバーレイ表示します。

private TIS.Imaging.OverlayBitmap overlayBitmap;
private TIS.Imaging.FrameSnapSink _fhs;
private void Form1_Load_1(object sender, EventArgs e)
{
    icImagingControl1.ShowDeviceSettingsDialog();

    if (!icImagingControl1.DeviceValid)
    {
        cmdStartLive.Enabled = false;
        cmdSettings.Enabled = false;
    }
    // カメラの設定した解像度に合わせて表示画面を変更
    icImagingControl1.LiveDisplayDefault = false;
    icImagingControl1.LiveDisplaySize = icImagingControl1.Size;

    // イメージバッファのカラーフォーマットをICRGB24にセット
    _fhs = new TIS.Imaging.FrameSnapSink(TIS.Imaging.MediaSubtypes.RGB24);
    icImagingControl1.Sink = _fhs;

    // オーバーレイビットマップの配置をディスプレイパスにセット
    icImagingControl1.OverlayBitmapPosition = TIS.Imaging.PathPositions.Display;
    overlayBitmap = icImagingControl1.OverlayBitmapAtPath[TIS.Imaging.PathPositions.Display];

    // オーバーレイを有効に
    overlayBitmap.Enable = true;



    cmdFindLaser.Enabled = false;
    cmdStoplive.Enabled = false;
}

最初にプログラムは.ShowDeviceSettingsDialogを使って使用するデバイスを選択します。以降の動作については以下の手順となります。

オーバーレイビットマップに簡単にアクセスできるよう、グローバル変数 overlayBitmapを作成します。イメージバッファのカラーフォーマットを.MediaSubtypes.RGB24にセットします。プログラムは赤色のレーザーポインタを探して、十字マークのオーバーレイを赤色で表示します。
OverlayBitmapを.OverlayBitmap.Enableとして有効にし、ディスプレイパスにセットします。これにより、描画した十字マークがレーザーポインタの探索アルゴリズムに影響しないようにします。

private void cmdFindLaser_Click(object sender, EventArgs e)
{
    int xLaser, yLaser;

    // Clear the overlay.
    overlayBitmap.Fill(overlayBitmap.DropOutColor);

    if (findLaserPoint(out xLaser, out yLaser))
    {
        DrawCrosshairs(xLaser, yLaser);
    }
    else
    {
        MessageBox.Show("No laser point found!");
    }
}

[find!]ボタンがクリックされると、メソッドfindLaserPointがコールされます。レーザーポインタが見つかると、このメソッドはtrueを返し、変数xLaser, yLaserで座標データを取得する事ができます。十字マークをその座標に描画します。

private bool findLaserPoint(out int xLaser, out int yLaser)
{

    TIS.Imaging.IFrameQueueBuffer rval = _fhs.SnapSingle(TimeSpan.FromSeconds(1));
    BufferAccessHelper buf = new BufferAccessHelper(rval);

    int redPixel = 0;
    xLaser = 0;
    yLaser = 0;


    for (int y = 0; y < rval.FrameType.Height; y++)
    {
        for (int x = 0; x < rval.FrameType.Width; x++)
        {
            // x and y index for the imagebuffer.

            int indexXred = x * 3 + 2;
            int indexXgreen = x * 3 + 1;
            int indexXblue = x * 3 + 0;
            int indexY = rval.FrameType.Height - y - 1;

            if (buf[indexXred, indexY] > 220 & buf[indexXgreen, indexY] < 80 & buf[indexXblue, indexY] < 80)
            {
                // Count red pixels.
                redPixel++;
                Console.Write(buf[indexXred, indexY]+":" + buf[indexXgreen, indexY] + ":" + buf[indexXblue, indexY] );
                xLaser = xLaser + x;
                yLaser = yLaser + y;
            }
        }
    }

メソッドfindLaserPointは cmdFindLaser_Clickからコールされ、イメージのレーザーポイントの探索の為に使用されます。この中で、SnapSingleをコールする事で、最新のイメージバッファを rvalにセットします。

このサンプルでは、赤の色情報だけを探索します。バッファ中のピクセルは座標 x , y で参照されます。ピクセルの赤データのみを使用するため、x 座標は3倍して使用されます。なぜなら、RGB24カラーフォーマットはピクセルあたりRGBの3bytesを持っているからです。その順序はB, G, R となっているので、赤だけを取り扱うためには、BとGデータの2Bytesをスキップする必要があるため、さらに2(Bytes)を追加します。

y座標も演算する必要があります。なぜならRGB24カラーフォーマットではバッファ上でイメージは上下逆さまに格納されているからです。抽出するための座標は計算され、それぞれ変数indexXred とindexYとして保持され、イメージバッファibのインデックスとして使用されます。

イメージ中のレーザーポインタは数ピクセルに及ぶある程度の大きさがあるはすです。その中心を割り出すため、輝度演算により抽出されたすべてのピクセルはredPixelにカウントされます。さらに、X, Y座標の値はxLaserとyLaserに加算されていきます。イメージ中のすべてのピクセルに対して処理が終わった後、xLaserとyLaserはそれぞれredPixelで割ることでレーザーポインタの中心を演算しています。(そのため、このサンプルで使用できるのは1点のレーザーポインタだけです。)

2つのfor ループはこのサンプルの画像処理アルゴリズムです。これらはイメージバッファ中の全てのX,Y座標のピクセルをチェックするためのものです。ここで、該当のピクセル輝度値が予め設定されたしきい値(230)よりも大きかった場合、そこにレーザーポインタがあると判断します。このメソッドの最後で抽出されたポイントから中心が計算されます。これらの値がレーザーポインタの位置として返されます。

private void DrawCrosshairs(int x, int y)
{
    overlayBitmap.DrawLine(Color.Red, x, y - 10, x, y + 10);
    overlayBitmap.DrawLine(Color.Red, x - 10, y, x + 10, y);
    overlayBitmap.DrawText(Color.White, x + 3, y + 2, x.ToString() + "," + y.ToString());
}

十字マークは2本の赤い線と座標を示した白のテキストで構成されます。overlayBitmap.DrawLineを2回コールすることで十字マークを作り、overlayBitmap.DrawTextをコールすることで座標のテキストを生成します。

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

Copyright © ARGO Corporation. All Rights Reserved.