GS 正規化相関サーチ(従来版)

Classes

ClassDescription
Public classCFviGSearch
正規化相関サーチクラス
Public classCFviGSearchData
正規化相関サーチデータ構造クラス
Public classCFviGSearchParam
正規化相関サーチ処理パラメータ構造クラス
Public classCFviGSearchResult
正規化相関サーチ結果クラス
Public classErrorCode
エラーコード(正規化相関サーチ関連)

Enumerations

EnumerationDescription
Public enumerationContinueOption
連続処理オプション
Public enumerationCorrelationPosition
相関位置
Public enumerationFilter
フィルタ
Public enumerationFilterMode
フィルタモード
Public enumerationPrecision
サーチ精度

Remarks

ここには、正規化相関サーチ関連のクラスを集約しています。

このクラス群は、過去のバージョンとの互換性の為に残しています。 新しい開発では FVIL.GS2 ネームスペースに集約された GS2 正規化相関サーチ(FIE版) を使用することを推奨します。


トピック:


解説:

正規化相関サーチはサーチ速度を向上させるため、パターンと入力画像の情報を数段階に圧縮し、 圧縮レベルの高い画像から低い画像へ圧縮レベルを落としながらサーチを行います。 サーチ開始圧縮レベルから終了レベルの 1 つ前までのサーチを「候補点サーチ」と呼んでいます。 サーチ終了圧縮レベルでのサーチを「最終サーチ」と呼んでいます。 候補点サーチは似ていると思われるパターンを探し出す(候補点を見つける)処理、 最終サーチは候補点が本当にサーチするパターンかどうか評価する処理、といえます。 最終サーチによって求められた回答に対し、近傍での相関値を用いてサブピクセル位置を計算します。

詳細については、別冊の画像処理解説書をご参照ください。

[↑戻る]


構成:

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

  • 本体:
    クラス内容
    CFviGSearchサーチ機能を持つクラスです。
  • データ構造:
    クラスデータID内容
    CFviGSearchData12001件分のサーチデータを格納するクラスです。下記の CFviGSearchResult から取得できます。
    CFviGSearchResult1201サーチ結果を格納するクラスです。
    CFviGSearchParam1202正規化相関サーチパラメータを保有するクラスです。
  • データ構造: (サーチパタン)
    クラスデータID内容
    CFviPattern101処理対象画像からサーチを行う為のパタン画像を格納するオブジェクトです。

[↑戻る]


コンポーネント:

本体の正規化相関サーチクラス(CFviGSearch)は、 サーチ対象の濃淡画像(CFviImage)と サーチを行う為のサーチパタン(CFviPattern)を要求し、 サーチ結果を格納するオブジェクト(CFviGSearchResult)を提供します。 サーチ対象の濃淡画像とサーチパタンは、実行前にユーザが設定する必要があります。 パラメータ(CFviGSearchParam)は、 本体の内部に保有しており、設定を変更するか否かは任意です。 設定を変更する場合は、CFviGSearch.Param プロパティを介して行えます。 本体の CFviGSearch.Execute を実行すると、サーチ結果を CFviGSearch.Result に格納します。

[↑戻る]

Examples

サンプルコード:

下記は、最も基本的な処理例を示します。
サーチパタン(FVIL.Data.CFviPattern)は、下図から
MakePattern(CFviImage, CFviRectangle, CFviPoint) を行って保存していたものを使用しています。 サーチパタンの生成やファイル保存については、 CFviPattern のサンプルコードを参考にしてください。
処理結果の画像下に記述している処理時間は、Pentium4 3.2GHz 1.0GB RAM で実行した時のものです。 画像サイズは 320x240 です。処理対象画像の状態やパラメータの設定内容によって速度は変化します。


【処理結果】


【パタン画像】


【関数の出力】
User.SampleCode.GSearch.Search
execute. 2.54 msec, count=2 

ソースコード:
C# Copy imageCopy
//    $Revision: 1.3 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;    // FvPluginXXXX attribute requires fvalgcli

namespace User.SampleCode
{
    public partial class GSearch
    {
        /// <summary>
        /// サーチ実行.
        /// </summary>
        [FvPluginExecute]
        public void Search()
        {
            System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod();
            Console.WriteLine("{0}.{1}", method.DeclaringType.FullName, method.Name);

            // 1) インスタンスの準備.
            FVIL.GSearch.CFviGSearch parser = new FVIL.GSearch.CFviGSearch();
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage();
            FVIL.Data.CFviPattern pattern = new FVIL.Data.CFviPattern();

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

            // 2-2) パタン画像の読み込み.
            pattern.Load(Defs.TestImageDir + "/clip.pat");

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

            // 4) 画像処理準備.
            // --- ライブラリのオープン.
            parser.Open(src.HorzSize, src.VertSize, 1024, -1);

            // --- 処理対象画像と結果格納用オブジェクトの設定.
            parser.SrcImages[0] = src;

            // 
            // ※パラメータを既定値から変更した部分は、コメントに [*] を記述しています.
            // 

            // 5-1) パラメータ設定.
            FVIL.GSearch.CFviGSearchParam    param = parser.Param;
            param.Count = 10;            // [*] サーチ個数.
                                        // [*] 精度: SuperHigh(超高精度)
            param.Precision = FVIL.GSearch.Precision.SuperHigh;
            param.Complexity = 1;        // [ ] 複雑度: 1~9
            param.Score1st = 4000;        // [*] 途中相関値閾値.
            param.Score2nd = 5000;        // [*] 最終相関値閾値.
            param.EdgeDetect = false;    // [ ] 処理範囲接触の許可 (false:非)

            // 5-E) サーチパタンのオープン.
            parser.OpenPattern( pattern, FVIL.GSearch.FilterMode.NormalPattern );

            // 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;    // パタン登録時の矩形.

                for( int i=0 ; i<parser.Result.Count ; i++ )
                {
                    FVIL.GSearch.CFviGSearchData data = parser.Result[i];

                    // サーチ結果の取得.
                    // --- 検出位置.
                    FVIL.Data.CFviPoint mark = data.Position;

                    // --- 検出位置とパタン情報から矩形を復元.
                    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.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);
                }

                // 保存.
                FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage();
                display.SaveImage( canvas, display.DisplayRect, 1.0 );
                FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/GSearch.Search.png", canvas);
            }
        }
    };
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli
' FvPluginXXXX attribute requires fvalgcli
Namespace SampleCode
    Public Partial Class GSearch
        ''' <summary>
        ''' サーチ実行.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub Search()
            Dim method As System.Reflection.MethodBase = System.Reflection.MethodBase.GetCurrentMethod()
            Console.WriteLine("{0}.{1}", method.DeclaringType.FullName, method.Name)

            ' 1) インスタンスの準備.
            Dim parser As New FVIL.GSearch.CFviGSearch()
            Dim src As New FVIL.Data.CFviImage()
            Dim pattern As New FVIL.Data.CFviPattern()

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

            ' 2-2) パタン画像の読み込み.
            pattern.Load(Defs.TestImageDir & "/clip.pat")

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

            ' 4) 画像処理準備.
            ' --- ライブラリのオープン.
            parser.Open(src.HorzSize, src.VertSize, 1024, -1)

            ' --- 処理対象画像と結果格納用オブジェクトの設定.
            parser.SrcImages(0) = src

            ' 
            ' ※パラメータを既定値から変更した部分は、コメントに [*] を記述しています.
            ' 

            ' 5-1) パラメータ設定.
            Dim param As FVIL.GSearch.CFviGSearchParam = parser.Param
            param.Count = 10
            ' [*] サーチ個数.
            ' [*] 精度: SuperHigh(超高精度)
            param.Precision = FVIL.GSearch.Precision.SuperHigh
            param.Complexity = 1
            ' [ ] 複雑度: 1~9
            param.Score1st = 4000
            ' [*] 途中相関値閾値.
            param.Score2nd = 5000
            ' [*] 最終相関値閾値.
            param.EdgeDetect = False
            ' [ ] 処理範囲接触の許可 (false:非)
            ' 5-E) サーチパタンのオープン.
            parser.OpenPattern(pattern, FVIL.GSearch.FilterMode.NormalPattern)

            ' 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
                ' パタン登録時の矩形.
                For i As Integer = 0 To parser.Result.Count - 1
                    Dim data As FVIL.GSearch.CFviGSearchData = parser.Result(i)

                    ' サーチ結果の取得.
                    ' --- 検出位置.
                    Dim mark As FVIL.Data.CFviPoint = data.Position

                    ' --- 検出位置とパタン情報から矩形を復元.
                    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.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)
                Next

                ' 保存.
                Dim canvas As New FVIL.Data.CFviImage()
                display.SaveImage(canvas, display.DisplayRect, 1.0)
                FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/GSearch.Search.png", canvas)
            End If
        End Sub
    End Class
End Namespace

[↑戻る]