Classes
Class | Description | |
---|---|---|
CFviGSearch | 正規化相関サーチクラス | |
CFviGSearchData | 正規化相関サーチデータ構造クラス | |
CFviGSearchParam | 正規化相関サーチ処理パラメータ構造クラス | |
CFviGSearchResult | 正規化相関サーチ結果クラス | |
ErrorCode | エラーコード(正規化相関サーチ関連) |
Enumerations
Enumeration | Description | |
---|---|---|
ContinueOption | 連続処理オプション | |
CorrelationPosition | 相関位置 | |
Filter | フィルタ | |
FilterMode | フィルタモード | |
Precision | サーチ精度 |
Remarks
ここには、正規化相関サーチ関連のクラスを集約しています。
このクラス群は、過去のバージョンとの互換性の為に残しています。 新しい開発では FVIL.GS2 ネームスペースに集約された GS2 正規化相関サーチ(FIE版) を使用することを推奨します。
トピック:
解説:
正規化相関サーチはサーチ速度を向上させるため、パターンと入力画像の情報を数段階に圧縮し、
圧縮レベルの高い画像から低い画像へ圧縮レベルを落としながらサーチを行います。
サーチ開始圧縮レベルから終了レベルの 1 つ前までのサーチを「候補点サーチ」と呼んでいます。
サーチ終了圧縮レベルでのサーチを「最終サーチ」と呼んでいます。
候補点サーチは似ていると思われるパターンを探し出す(候補点を見つける)処理、
最終サーチは候補点が本当にサーチするパターンかどうか評価する処理、といえます。
最終サーチによって求められた回答に対し、近傍での相関値を用いてサブピクセル位置を計算します。
詳細については、別冊の画像処理解説書をご参照ください。
構成:
この機能は、サーチ機能を持つ本体と、サーチ結果やパラメータを保有するデータ構造で構成されます。
-
本体:
クラス 内容 CFviGSearch サーチ機能を持つクラスです。 -
データ構造:
クラス データID 内容 CFviGSearchData 1200 1件分のサーチデータを格納するクラスです。下記の CFviGSearchResult から取得できます。 CFviGSearchResult 1201 サーチ結果を格納するクラスです。 CFviGSearchParam 1202 正規化相関サーチパラメータを保有するクラスです。 -
データ構造: (サーチパタン)
クラス データID 内容 CFviPattern 101 処理対象画像からサーチを行う為のパタン画像を格納するオブジェクトです。
コンポーネント:
本体の正規化相関サーチクラス(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 |
---|---|
// $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 |
---|---|
' $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 |