グレイサーチ

Namespace: FVIL.GS2
Assembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)

Syntax

C#
[SerializableAttribute]
public class CFviGS2 : CFviImageParser
Visual Basic
<SerializableAttribute>
Public Class CFviGS2
	Inherits CFviImageParser

Remarks

グレイサーチを実行するためのクラスです。


マルチコア対応:

このクラスの Execute()()()() メソッドは、 SetParallelNum(Int32) によって設定されたスレッド数に従って、 自動的に処理を並列化します。 マルチコア環境においては、処理を並列化する事によりレーテンシを短縮できる場合があります。 詳しくは、 SetParallelNum(Int32) の説明をご参照ください。


要求する入出力画像数:
項目定数
入力画像1SrcImageCount フィールド
出力画像0DstImageCount フィールド

処理対象画像の条件:

処理対象の画像は下記の条件を満たしている必要が有ります。

  • 画像種別が FVIL.ImageType.UC8 である事
  • チャネル数が 1 である事
  • 縦横サイズがともに、パタン画像より大きい事

グレイサーチオブジェクト関連プロパティ:

下表に示すプロパティは、グレイサーチの作業領域となるグレイサーチオブジェクトに関連するプロパティです。 このクラスを標準のコンストラクタで構築した場合は、下表に示す値で初期化されています。 これらの設定を変更する場合は、 Open(UInt32, UInt32, UInt32) メソッドを使用してください。 尚、グレイサーチオブジェクトは、このインスタンスが解放される際に自動的に解放されます。 ユーザが解放する場合は、Close()()()() メソッドを使用してください。

プロパティ初期値範囲説明
IsOpenedtruetrue/falseオープン状態
HandleIntPtr.Zero有効なハンドル / NULL (IntPtr.Zero) グレイサーチオブジェクトハンドル
FirstBuffSize00 または 1~ 初期サーチ結果候補初期バッファサイズ
通常は 0 を指定してください。0 を指定すると、デフォルト値を使用します。 初期サイズが小さく、メモリが足りなくなった場合には内部で自動で再アロケートを行いますが、 メモリの再アロケートを少なくしたい等の理由で、初期サイズを変更する場合に指定します。 なお、この設定値によってサーチ結果が変化することはありません。
LastBuffSize00 または 1~ 最終サーチ結果候補初期バッファサイズ
通常は 0 を指定してください。0 を指定すると、デフォルト値を使用します。 初期サイズが小さく、メモリが足りなくなった場合には内部で自動で再アロケートを行いますが、 メモリの再アロケートを少なくしたい等の理由で、初期サイズを変更する場合に指定します。 なお、この設定値によってサーチ結果が変化することはありません。
CachePowNum00 または 3~15 中間スコアキャッシュサイズ
通常は 0 を指定してください。0 を指定すると、デフォルト値を使用します。 本ライブラリでは重複した相関スコアの計算を避けるために、 既に計算した 相関スコアを一時的に保存するキャッシュ領域を持ちます。 本パラメータはこの相関スコアのキャッシュサイズを指定します。 大きな値を設定するとキャッシュヒット率が上がる場合がありますが、 その効果はわずかな場合が多く、必要なメモリ量が大幅に増えるため、 デフォルト値以外での利用は推奨しません。 なお、この設定値によってサーチ結果が変化することはありません。

初期値と範囲:
プロパティ初期値範囲説明
PatternnullCFviGS2Pattern のインスタンスグレイサーチパタンオブジェクト
ParamCFviGS2Param のインスタンスCFviGS2Param のインスタンス
※インスタンスの差し替えは行えません。
グレイサーチパラメータ
ResultCFviGS2Result のインスタンスCFviGS2Result のインスタンスグレイサーチ結果格納用オブジェクト
ExecuteOptionExecuteOption.DefaultExecuteOption に定義された定数実行オプション
ContinueOptionContinueOption.NoneContinueOption に定義された定数継続サーチオプション

処理対象画像の有効性検査と有効化:
  • 入力画像の有効性検査
    このクラスの CheckValidity(CFviImage) 関数で入力画像の有効性を検査できます。 この関数はスタティックメンバですので、このクラスのインスタンスを生成せずに直接呼び出す事ができます。
  • 入出力画像の整合性検査
    このクラスの IsValid()()()() メソッドで入出力画像の整合性を検査できます。 このメソッドが false を返す場合は、前述の処理対象画像の条件を満たしていない為、 実行できない事を意味します。
  • 出力画像の有効化
    このクラスでは有効化はサポートしていません。
    Validate()()()() または Validate(Int32) メソッドを実行した場合は常に例外を発行します。

関連する FIE 関数:

fnFIE_gs2_alloc
fnFIE_gs2_search
fnFIE_gs2_search_enforce
fnFIE_gs2_search_enforce2

Examples

ソースコード:
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;

namespace User.SampleCode
{
    public partial class GS2
    {
        [FvPluginExecute]
        public void Execute()
        {
            try
            {
                // 1) インスタンスの準備.
                FVIL.GS2.CFviGS2 parser = new FVIL.GS2.CFviGS2();
                parser.Open();

                // 2-1) 処理対象画像の取り込み.
                FVIL.Data.CFviImage src = new FVIL.Data.CFviImage();
                FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/clip_UC8_M.png", src, FVIL.PixelMode.Unpacking);

                // 2-2) パタン画像の読み込みとグレイサーチパタンの生成.
                FVIL.Data.CFviPattern pattern = new FVIL.Data.CFviPattern();
                FVIL.GS2.CFviGS2Pattern gs2pattern = new FVIL.GS2.CFviGS2Pattern();
                pattern.Load(Defs.TestImageDir + "/clip.pat");
                gs2pattern.Create( pattern, FVIL.GS2.Filter.Smooth);

                // 3) 処理対象画像の有効性検査.
                if (FVIL.ErrorCode._SUCCESS != FVIL.GS2.CFviGS2.CheckValidity(src)) return;
                if (FVIL.ErrorCode._SUCCESS != FVIL.GS2.CFviGS2.CheckValidity(pattern)) return;

                // 4) 画像処理準備.
                // --- 処理対象画像の設定.
                parser.SrcImages[0] = src;

                // 5-1) パラメータ設定.
                parser.ExecuteOption = FVIL.GS2.ExecuteOption.Default;
                parser.ContinueOption = FVIL.GS2.ContinueOption.None;

                parser.Param.Count = 2;
                parser.Param.EdgeDetect = true;
                parser.Param.ReverseMode = false;
                parser.Param.Precision = FVIL.GS2.Precision.Normal;
                parser.Param.Complexity = 1;

                parser.Result = new FVIL.GS2.CFviGS2Result();

                // --- グレイサーチパタンの設定.
                parser.Pattern = gs2pattern;

                // 6) 画像処理実行.
                FVIL.CFviTimeCounter timer = new FVIL.CFviTimeCounter();
                timer.Start();
                parser.Execute();
                double msec = timer.Stop();
                Console.WriteLine("execute. {0} msec, count={1} ", msec.ToString("0.###"), parser.Result.Count);

                // E) 確認用.
                {
                    // 画像表示の準備.
                    FVIL.GDI.CFviDisplay display = new FVIL.GDI.CFviDisplay();
                    display.Image = src;
                    display.DisplayRect = src.Window;

                    // オーバレイの生成.
                    FVIL.GDI.CFviOverlay pOverlay0 = new FVIL.GDI.CFviOverlay();
                    pOverlay0.Scaling = true;
                    display.Overlays.Add(pOverlay0);

                    FVIL.Data.CFviPoint pat_mark = pattern.CenterMark;    // パタン登録時の基準点.
                    FVIL.Data.CFviRectangle pat_rect = pattern.RegistRect;    // パタン登録時の矩形.

                    fvalgcli.F_GS_RESULT_PTR data_ptr = parser.Result.Address;

                    for (int i = 0; i < parser.Result.Count; i++)
                    {

                        // サーチ結果の取得.
                        // --- 検出位置.
                        FVIL.Data.CFviPoint mark = new FVIL.Data.CFviPoint(data_ptr[0].x / 100, data_ptr[0].y / 100);

                        // --- 検出位置とパタン情報から矩形を復元.
                        FVIL.Data.CFviRectangle rect = new FVIL.Data.CFviRectangle();
                        rect.St = new FVIL.Data.CFviPoint(mark.X - pat_mark.X, mark.Y - pat_mark.Y);
                        rect.Ed = new FVIL.Data.CFviPoint(rect.X + pat_rect.Width, rect.Y + pat_rect.Height);

                        // --- 相関値.
                        System.String score = data_ptr[0].score.ToString();

                        // 描画用.
                        // --- 矩形(塗り潰し)
                        FVIL.GDI.CFviGdiImage _fill = new FVIL.GDI.CFviGdiImage();
                        _fill.SetSize(1, 1, 32);
                        _fill.Position = rect.St;
                        _fill.Alpha = 0x3F;
                        _fill.StretchHorzSize = (int)(rect.Width);
                        _fill.StretchVertSize = (int)(rect.Height);
                        _fill.SetPixelRGB(0, 0, Color.FromArgb(0xFF, 0x00, 0x00, 0xFF));    // A,R,G,B

                        // --- 矩形(枠)
                        FVIL.GDI.CFviGdiRectangle _rect = new FVIL.GDI.CFviGdiRectangle(rect);
                        _rect.Pen.Color = Color.FromArgb(0x00, 0x00, 0xFF);

                        // --- 基準点.
                        FVIL.GDI.CFviGdiPoint _mark = new FVIL.GDI.CFviGdiPoint(mark);
                        _mark.Size = new Size(5, 5);
                        _mark.Pen.Color = Color.FromArgb(0xFF, 0x00, 0x00);

                        // --- 相関値.
                        FVIL.GDI.CFviGdiString _score = new FVIL.GDI.CFviGdiString();
                        _score.Text = score.ToString();
                        _score.Position = mark;
                        _score.Align = FVIL.GDI.TextAlign.Right | FVIL.GDI.TextAlign.Bottom;
                        _score.BkMode = FVIL.GDI.BkMode.Transparent;
                        _score.Color = Color.FromArgb(0xFF, 0xFF, 0x00);

                        // 追加.
                        pOverlay0.Figures.Add(_fill);
                        pOverlay0.Figures.Add(_rect);
                        pOverlay0.Figures.Add(_mark);
                        pOverlay0.Figures.Add(_score);

                        data_ptr += 1;
                    }

                    // 保存.
                    FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage();
                    display.SaveImage(canvas, display.DisplayRect, 1.0);
                    FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/GS2.ExecuteGS2.png", canvas);
                }
            }
            catch( FVIL.CFviException ex )
            {
                Assert.Fail("{0}: ErrorCode={1} {2}", ex.Function, ex.ErrorCode, ex.Message);
            }
        }
    }
}


Visual Basic Copy imageCopy
Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli

Namespace SampleCode
    Public Partial Class GS2
        <FvPluginExecute> _
        Public Sub Execute()
            Try
                ' 1) インスタンスの準備.
                Dim parser As New FVIL.GS2.CFviGS2()
                parser.Open()

                ' 2-1) 処理対象画像の取り込み.
                Dim src As New FVIL.Data.CFviImage()
                FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/clip_UC8_M.png", src, FVIL.PixelMode.Unpacking)

                ' 2-2) パタン画像の読み込みとグレイサーチパタンの生成.
                Dim pattern As New FVIL.Data.CFviPattern()
                Dim gs2pattern As New FVIL.GS2.CFviGS2Pattern()
                pattern.Load(Defs.TestImageDir & "/clip.pat")
                gs2pattern.Create(pattern, FVIL.GS2.Filter.Smooth)

                ' 3) 処理対象画像の有効性検査.
                If FVIL.ErrorCode._SUCCESS <> FVIL.GS2.CFviGS2.CheckValidity(src) Then
                    Return
                End If
                If FVIL.ErrorCode._SUCCESS <> FVIL.GS2.CFviGS2.CheckValidity(pattern) Then
                    Return
                End If

                ' 4) 画像処理準備.
                ' --- 処理対象画像の設定.
                parser.SrcImages(0) = src

                ' 5-1) パラメータ設定.
                parser.ExecuteOption = FVIL.GS2.ExecuteOption.[Default]
                parser.ContinueOption = FVIL.GS2.ContinueOption.None

                parser.Param.Count = 2
                parser.Param.EdgeDetect = True
                parser.Param.ReverseMode = False
                parser.Param.Precision = FVIL.GS2.Precision.Normal
                parser.Param.Complexity = 1

                parser.Result = New FVIL.GS2.CFviGS2Result()

                ' --- グレイサーチパタンの設定.
                parser.Pattern = gs2pattern

                ' 6) 画像処理実行.
                Dim timer As New FVIL.CFviTimeCounter()
                timer.Start()
                parser.Execute()
                Dim msec As Double = timer.[Stop]()
                Console.WriteLine("execute. {0} msec, count={1} ", msec.ToString("0.###"), parser.Result.Count)

                ' E) 確認用.
                If True Then
                    ' 画像表示の準備.
                    Dim display As New FVIL.GDI.CFviDisplay()
                    display.Image = src
                    display.DisplayRect = src.Window

                    ' オーバレイの生成.
                    Dim pOverlay0 As New FVIL.GDI.CFviOverlay()
                    pOverlay0.Scaling = True
                    display.Overlays.Add(pOverlay0)

                    Dim pat_mark As FVIL.Data.CFviPoint = pattern.CenterMark
                    ' パタン登録時の基準点.
                    Dim pat_rect As FVIL.Data.CFviRectangle = pattern.RegistRect
                    ' パタン登録時の矩形.
                    Dim data_ptr As fvalgcli.F_GS_RESULT_PTR = parser.Result.Address

                    For i As Integer = 0 To parser.Result.Count - 1

                        ' サーチ結果の取得.
                        ' --- 検出位置.
                        Dim mark As New FVIL.Data.CFviPoint(data_ptr(0).x \ 100, data_ptr(0).y \ 100)

                        ' --- 検出位置とパタン情報から矩形を復元.
                        Dim rect As New FVIL.Data.CFviRectangle()
                        rect.St = New FVIL.Data.CFviPoint(mark.X - pat_mark.X, mark.Y - pat_mark.Y)
                        rect.Ed = New FVIL.Data.CFviPoint(rect.X + pat_rect.Width, rect.Y + pat_rect.Height)

                        ' --- 相関値.
                        Dim score As System.String = data_ptr(0).score.ToString()

                        ' 描画用.
                        ' --- 矩形(塗り潰し)
                        Dim _fill As New FVIL.GDI.CFviGdiImage()
                        _fill.SetSize(1, 1, 32)
                        _fill.Position = rect.St
                        _fill.Alpha = &H3f
                        _fill.StretchHorzSize = CInt(Math.Truncate(rect.Width))
                        _fill.StretchVertSize = CInt(Math.Truncate(rect.Height))
                        _fill.SetPixelRGB(0, 0, Color.FromArgb(&Hff, &H0, &H0, &Hff))
                        ' A,R,G,B
                        ' --- 矩形(枠)
                        Dim _rect As New FVIL.GDI.CFviGdiRectangle(rect)
                        _rect.Pen.Color = Color.FromArgb(&H0, &H0, &Hff)

                        ' --- 基準点.
                        Dim _mark As New FVIL.GDI.CFviGdiPoint(mark)
                        _mark.Size = New Size(5, 5)
                        _mark.Pen.Color = Color.FromArgb(&Hff, &H0, &H0)

                        ' --- 相関値.
                        Dim _score As New FVIL.GDI.CFviGdiString()
                        _score.Text = score.ToString()
                        _score.Position = mark
                        _score.Align = FVIL.GDI.TextAlign.Right Or FVIL.GDI.TextAlign.Bottom
                        _score.BkMode = FVIL.GDI.BkMode.Transparent
                        _score.Color = Color.FromArgb(&Hff, &Hff, &H0)

                        ' 追加.
                        pOverlay0.Figures.Add(_fill)
                        pOverlay0.Figures.Add(_rect)
                        pOverlay0.Figures.Add(_mark)
                        pOverlay0.Figures.Add(_score)

                        data_ptr += 1
                    Next

                    ' 保存.
                    Dim canvas As New FVIL.Data.CFviImage()
                    display.SaveImage(canvas, display.DisplayRect, 1.0)
                    FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/GS2.ExecuteGS2.png", canvas)
                End If
            Catch ex As FVIL.CFviException
                Assert.Fail("{0}: ErrorCode={1} {2}", ex.[Function], ex.ErrorCode, ex.Message)
            End Try
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.GS2..::..CFviGS2

See Also