GS2 正規化相関サーチ

Classes

ClassDescription
Public classCFviGS2
グレイサーチ
Public classCFviGS2Data
グレイサーチデータ
Public classCFviGS2Param
グレイサーチパラメータ
Public classCFviGS2Pattern
グレイサーチパタンオブジェクト
Public classCFviGS2Result
グレイサーチ結果

Enumerations

EnumerationDescription
Public enumerationContinueOption
継続サーチオプション
Public enumerationExecuteOption
実行オプション
Public enumerationFilter
圧縮フィルタ
Public enumerationPrecision
精度モード
Public enumerationSubpxl
精サーチ・サブピクセル推定の近傍

Remarks

このネームスペースには GS2 関連のクラス、関数、定数を集約しています。

このクラス群は、FIE ライブラリの fnFIE_gs2_xxxx 関数群を集約したものです。 OpenMP による並列化により、従来の 正規化相関サーチ より高速化されています。

アルゴリズムに関する詳細な説明は、別冊 FIE ライブラリ説明書 をご参照ください。
説明は、下記の階層にあります。

		モジュール
		├ FIE module
		│├ サーチ
		││├ グレイサーチ(正規化相関サーチ)
		│││├ 説明
		


トピック:


構成:

この機能は、サーチ機能を持つ本体と、サーチ結果やパラメータを保有するデータ構造で構成されます。

  • 本体:
    クラス内容
    CFviGS2サーチ機能を持つクラスです。
  • データ構造:
    クラスデータID内容
    CFviGS2Pattern1900パタン画像(CFviPattern)の情報を格納するクラスです。
    CFviGS2Result1901サーチ結果を格納するクラスです。
    CFviGS2Param1902正規化相関サーチパラメータを保有するクラスです。
    CFviGS2Data1903サーチ結果1つ分の情報を格納するクラスです。
  • データ構造: (サーチパタン)
    クラスデータID内容
    CFviPattern101処理対象画像からサーチを行う為のパタン画像を格納するオブジェクトです。

[↑戻る]


コンポーネント:

[↑戻る]

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

[↑戻る]


サンプルコード (継続サーチ):

対象画像とパタン画像が 1:N の関係の時は、 継続サーチオプション(ContinueOption) を使用すると処理時間を短縮できます。

対象画像:

パタン画像:

出力結果:

images(0), patterns(0)
[0]    70.830,   60.440,9300
[1]    63.990,   37.390,9272
images(0), patterns(1)
[0]    54.540,   82.560,9281
images(1), patterns(0)
[0]    63.990,   84.430,9407
[1]    70.820,   61.380,9185
images(1), patterns(1)
		



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 ExecuteC1()
        {
            string[] image_files = 
            {
                "/MarkSearch_Target1.png",
                "/MarkSearch_Target2.png"
            };

            string[] pattern_files = 
            {
                "/MarkSearch_Pattern1.png",
                "/MarkSearch_Pattern2.png"
            };

            // パタン生成.
            FVIL.GS2.CFviGS2Pattern[] patterns = new FVIL.GS2.CFviGS2Pattern[2];
            for (int i = 0; i < 2; i++)
            {
                FVIL.Data.CFviImage pat = new FVIL.Data.CFviImage(Defs.TestImageDir + pattern_files[i]);
                FVIL.Data.CFviPoint offset = new FVIL.Data.CFviPoint(
                        pat.HorzSize * 0.5,
                        pat.HorzSize * 0.5
                    );
                patterns[i] = new FVIL.GS2.CFviGS2Pattern(pat, offset, FVIL.GS2.Filter.Min, null);
            }

            // インスタンスの準備.
            FVIL.GS2.CFviGS2Result result = new FVIL.GS2.CFviGS2Result();
            FVIL.GS2.CFviGS2 parser = new FVIL.GS2.CFviGS2();
            parser.Open();
            parser.Result = result;
            parser.ExecuteOption = FVIL.GS2.ExecuteOption.Enforce2;
            parser.Param.Count = 2;
            parser.Param.ThresholdMid = 5000;
            parser.Param.ThresholdFinal = 7000;
            parser.Param.EdgeDetect = false;
            parser.Param.ReverseMode = false;
            parser.Param.FirstUnit = 1;
            parser.Param.LastUnit = 0;
            parser.Param.Subpxl = FVIL.GS2.Subpxl.Neib8;

            // サーチ.
            for (int i = 0; i < 2; i++)
            {
                // 対象画像の読み込み.
                FVIL.Data.CFviImage src = new FVIL.Data.CFviImage(Defs.TestImageDir + image_files[i]);

                for (int j = 0; j < 2; j++)
                {
                    // 画像とパタンの設定.
                    parser.SrcImages[0] = src;
                    parser.Pattern = patterns[j];

                    // 初回(0)は通常サーチ、次回(1~)から継続サーチ.
                    if (j == 0)
                        parser.ContinueOption = FVIL.GS2.ContinueOption.None;
                    else
                        parser.ContinueOption = FVIL.GS2.ContinueOption.Continue;

                    result.Clear();
                    parser.Execute();

                    // --- 確認用.
                    Console.WriteLine("images({0}), patterns({1})", i, j);
                    int count = result.Count;
                    for (int k = 0; k < count; k++)
                    {
                        FVIL.GS2.CFviGS2Data data = new FVIL.GS2.CFviGS2Data(result[k]);

                        Console.WriteLine("[{0}] {1,9:0.000},{2,9:0.000},{3:0000}"
                            , k
                            , data.Position.X
                            , data.Position.Y
                            , data.Score
                            );
                    }
                }
            }
        }
    }
}

[↑戻る]



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

Namespace SampleCode
    Partial Public Class GS2
        <FvPluginExecute()> _
        Public Sub ExecuteC1()
            Dim image_files As String() = { _
             "/MarkSearch_Target1.png", _
             "/MarkSearch_Target2.png" _
            }

            Dim pattern_files As String() = { _
             "/MarkSearch_Pattern1.png", _
             "/MarkSearch_Pattern2.png" _
            }

            ' パタン生成.
            Dim patterns As FVIL.GS2.CFviGS2Pattern() = New FVIL.GS2.CFviGS2Pattern(1) {}
            For i As Integer = 0 To 1
                Dim pat As New FVIL.Data.CFviImage(Defs.TestImageDir & pattern_files(i))
                Dim offset As New FVIL.Data.CFviPoint(pat.HorzSize * 0.5, pat.HorzSize * 0.5)
                patterns(i) = New FVIL.GS2.CFviGS2Pattern(pat, offset, FVIL.GS2.Filter.Min, Nothing)
            Next

            ' インスタンスの準備.
            Dim result As New FVIL.GS2.CFviGS2Result()
            Dim parser As New FVIL.GS2.CFviGS2()
            parser.Open()
            parser.Result = result
            parser.ExecuteOption = FVIL.GS2.ExecuteOption.Enforce2
            parser.Param.Count = 2
            parser.Param.ThresholdMid = 5000
            parser.Param.ThresholdFinal = 7000
            parser.Param.EdgeDetect = False
            parser.Param.ReverseMode = False
            parser.Param.FirstUnit = 1
            parser.Param.LastUnit = 0
            parser.Param.Subpxl = FVIL.GS2.Subpxl.Neib8

            ' サーチ.
            For i As Integer = 0 To 1
                ' 対象画像の読み込み.
                Dim src As New FVIL.Data.CFviImage(Defs.TestImageDir & image_files(i))

                For j As Integer = 0 To 1
                    ' 画像とパタンの設定.
                    parser.SrcImages(0) = src
                    parser.Pattern = patterns(j)

                    ' 初回(0)は通常サーチ、次回(1~)から継続サーチ.
                    If j = 0 Then
                        parser.ContinueOption = FVIL.GS2.ContinueOption.None
                    Else
                        parser.ContinueOption = FVIL.GS2.ContinueOption.[Continue]
                    End If

                    result.Clear()
                    parser.Execute()

                    ' --- 確認用.
                    Console.WriteLine("images({0}), patterns({1})", i, j)
                    Dim count As Integer = result.Count
                    For k As Integer = 0 To count - 1
                        Dim data As New FVIL.GS2.CFviGS2Data(result(k))

                        Console.WriteLine("[{0}] {1,9:0.000},{2,9:0.000},{3:0000}", k, data.Position.X, data.Position.Y, data.Score)
                    Next
                Next
            Next
        End Sub
    End Class
End Namespace

[↑戻る]


サンプルコード (処理範囲指定):

限られた範囲をサーチする場合は2つの方法があります。

  1. 画像オブジェクトの処理範囲を指定する。
  2. チャイルド画像を指定する。
一般的には 前者 1) の方法で行いますが、対象画像が非常に大きく、処理範囲が非常に小さい場合は、
後者 2) の方法で行うことにより、画像圧縮処理の時間を短縮することができます。

画像圧縮処理とは、指定された画像の幅/高さをそれぞれ 1/2N に圧縮する処理です。
詳しくは、別冊 FIE ライブラリ説明書のグレイサーチの説明のページに記載されている "粗密探索と画像圧縮" の項をご参照ください。
説明は、下記の階層にあります。

		モジュール
		├ FIE module
		│├ サーチ
		││├ グレイサーチ(正規化相関サーチ)
		│││├ 説明
		

サーチ処理の時間に差異はありませんが、サーチ処理の前の画像圧縮の処理量が下記のように異なります。

前者 1) の方法は、画像全体の圧縮を行います。
後者 2) の方法は、部分画像の圧縮を行います。

但し、サーチ結果の座標が異なることにご注意ください。
後者 2) は、部分画像の左上を原点(0,0)とする座標を返します。
画像全体の左上を原点とする座標に変換するには、サーチ結果にオフセット値を加算する必要があります。

対象画像:
1) 画像全体
2) 部分画像

出力結果:

[1]     1.367 msec
  867.000,  151.000,9999
[2]     0.696 msec
  867.000,  151.000,9999
		



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 ExecuteC2()
        {
            // 対象画像の読み込み.
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage(
                Defs.TestImageDir + "/fvc06_full.png"
                );

            // パタン生成.
            FVIL.Data.CFviImage pat = new FVIL.Data.CFviImage(
                Defs.TestImageDir + "/fvc06_pattern.png"
                );
            FVIL.Data.CFviPoint offset = new FVIL.Data.CFviPoint(0, 0);
            FVIL.GS2.CFviGS2Pattern pattern = new FVIL.GS2.CFviGS2Pattern(pat, offset, FVIL.GS2.Filter.Smooth, null);

            // インスタンスの準備.
            FVIL.CFviTimeCounter    watch = new FVIL.CFviTimeCounter();
            FVIL.GS2.CFviGS2Result result = new FVIL.GS2.CFviGS2Result();
            FVIL.GS2.CFviGS2       parser = new FVIL.GS2.CFviGS2();
            parser.Open();
            parser.Result = result;
            parser.ExecuteOption = FVIL.GS2.ExecuteOption.Enforce2;
            parser.ContinueOption = FVIL.GS2.ContinueOption.None;
            parser.Param.Count = 1;
            parser.Param.ThresholdMid = 5000;
            parser.Param.ThresholdFinal = 8000;
            parser.Param.EdgeDetect = false;
            parser.Param.ReverseMode = false;
            parser.Param.FirstUnit = 1;
            parser.Param.LastUnit = 0;
            parser.Param.Subpxl = FVIL.GS2.Subpxl.Neib4;

            // 1) 処理範囲指定.
            {
                src.Window = new Rectangle( 756, 127, 354, 74 );

                // 画像とパタンの設定.
                parser.SrcImages[0] = src;
                parser.Pattern = pattern;

                result.Clear();

                watch.Start();
                parser.Execute();
                double msec = watch.Stop();

                // --- 確認.
                Console.WriteLine("[1] {0,9:0.000} msec", msec);
                if (result.Count > 0)
                {
                    FVIL.GS2.CFviGS2Data data = new FVIL.GS2.CFviGS2Data(result[0]);

                    Console.WriteLine("{0,9:0.000},{1,9:0.000},{2:0000}"
                        , data.Position.X
                        , data.Position.Y
                        , data.Score
                        );
                }
            }

            // 2) FIE チャイルド画像指定.
            {
                // 部分画像の生成.
                Rectangle window = new Rectangle( 756, 127, 354, 74 );
                FVIL.Data.CFviImage part = new FVIL.Data.CFviImage( src.GetFIE(), 0, window );

                // 画像とパタンの設定.
                parser.SrcImages[0] = part;
                parser.Pattern = pattern;

                result.Clear();

                watch.Start();
                parser.Execute();
                double msec = watch.Stop();

                // --- 確認.
                Console.WriteLine("[2] {0,9:0.000} msec", msec);
                if (result.Count > 0)
                {
                    FVIL.GS2.CFviGS2Data data = new FVIL.GS2.CFviGS2Data(result[0]);

                    Console.WriteLine("{0,9:0.000},{1,9:0.000},{2:0000}"
                        , data.Position.X + window.X
                        , data.Position.Y + window.Y
                        , data.Score
                        );
                }
            }
        }
    }
}

[↑戻る]



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

Namespace SampleCode
    Partial Public Class GS2
        <FvPluginExecute()> _
        Public Sub ExecuteC2()
            ' 対象画像の読み込み.
            Dim src As New FVIL.Data.CFviImage(Defs.TestImageDir & "/fvc06_full.png")

            ' パタン生成.
            Dim pat As New FVIL.Data.CFviImage(Defs.TestImageDir & "/fvc06_pattern.png")
            Dim offset As New FVIL.Data.CFviPoint(0, 0)
            Dim pattern As New FVIL.GS2.CFviGS2Pattern(pat, offset, FVIL.GS2.Filter.Smooth, Nothing)

            ' インスタンスの準備.
            Dim watch As New FVIL.CFviTimeCounter()
            Dim result As New FVIL.GS2.CFviGS2Result()
            Dim parser As New FVIL.GS2.CFviGS2()
            parser.Open()
            parser.Result = result
            parser.ExecuteOption = FVIL.GS2.ExecuteOption.Enforce2
            parser.ContinueOption = FVIL.GS2.ContinueOption.None
            parser.Param.Count = 1
            parser.Param.ThresholdMid = 5000
            parser.Param.ThresholdFinal = 8000
            parser.Param.EdgeDetect = False
            parser.Param.ReverseMode = False
            parser.Param.FirstUnit = 1
            parser.Param.LastUnit = 0
            parser.Param.Subpxl = FVIL.GS2.Subpxl.Neib4

            ' 1) 処理範囲指定.
            If True Then
                src.Window = New Rectangle(756, 127, 354, 74)

                ' 画像とパタンの設定.
                parser.SrcImages(0) = src
                parser.Pattern = pattern

                result.Clear()

                watch.Start()
                parser.Execute()
                Dim msec As Double = watch.[Stop]()

                ' --- 確認.
                Console.WriteLine("[1] {0,9:0.000} msec", msec)
                If result.Count > 0 Then
                    Dim data As New FVIL.GS2.CFviGS2Data(result(0))

                    Console.WriteLine("{0,9:0.000},{1,9:0.000},{2:0000}" _
                          , data.Position.X _
                          , data.Position.Y _
                          , data.Score)
                End If
            End If

            ' 2) FIE チャイルド画像指定.
            If True Then
                ' 部分画像の生成.
                Dim window As New Rectangle(756, 127, 354, 74)
                Dim part As New FVIL.Data.CFviImage(src.GetFIE(), 0, window)

                ' 画像とパタンの設定.
                parser.SrcImages(0) = part
                parser.Pattern = pattern

                result.Clear()

                watch.Start()
                parser.Execute()
                Dim msec As Double = watch.[Stop]()

                ' --- 確認.
                Console.WriteLine("[2] {0,9:0.000} msec", msec)
                If result.Count > 0 Then
                    Dim data As New FVIL.GS2.CFviGS2Data(result(0))

                    Console.WriteLine("{0,9:0.000},{1,9:0.000},{2:0000}" _
                     , data.Position.X + window.X _
                     , data.Position.Y + window.Y _
                     , data.Score)
                End If
            End If
        End Sub
    End Class
End Namespace

[↑戻る]