特徴点応用マッチングクラス(相関エッジフィルタ)
Namespace: FVIL.FPMAssembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)
Syntax
C# |
---|
[SerializableAttribute] public class CFviFPMCorrelationEdge : CFviFPM |
Visual Basic |
---|
<SerializableAttribute> Public Class CFviFPMCorrelationEdge Inherits CFviFPM |
Remarks
画像とテンプレートの特徴点およびエッジ点のマッチングを行ないます。 このクラスは、特徴点の抽出に相関エッジフィルタを使用します。
要求する入出力画像数:
項目 | 数 | 定数 |
---|---|---|
入力画像 | 1 | SrcImageCount フィールド |
出力画像 | 0 | DstImageCount フィールド |
処理対象画像の条件:
処理対象の画像は下記の条件を満たしている必要が有ります。
- 画像種別が FVIL.ImageType.UC8 である事 -
- チャネル数が 1 である事 -
- 画像領域のX方向メモリサイズ(バイト数)が8の倍数である事 -
初期値と範囲:
プロパティ | 初期値 | 範囲 |
---|---|---|
ParamEdge | CFviFPMParamCorrelationEdge の初期値 | ※インスタンスの差し替えはできません。 |
Examples
CFviFPMCorrelationEdge を使用したマッチング処理の例を示します。
マッチングテンプレート(FVIL.Data.CFviPattern)は、
処理対象画像から
MakePattern(CFviImage, CFviRectangle, CFviPoint)
を行って保存していたものを使用しています。
マッチングテンプレートの生成やファイル保存については、
CFviPattern のサンプルコードを参考にしてください。
処理結果の画像下に記述している処理時間は、Pentium4 3.2GHz 1.0GB RAM で実行した時のものです。
画像サイズは 320x240 です。処理対象画像の状態やパラメータの設定内容によって速度は変化します。
1) 線幅が細い画像
【パタン画像】
【関数の出力】
User.SampleCode.FPM.Search_CorrelationEdge(0,1) edges=103 execute. 23.988 msec, count=5
【パラメータ調整】
項目 | 値 | メンバ |
---|---|---|
局所領域サイズ(横方向) | 3 | RegionWidth |
局所領域サイズ(縦方向) | 3 | RegionHeight |
非極大抑制処理のフィルタ片幅 | 1 | NmsLength |
2) 線幅が太い画像
【パタン画像】
【関数の出力】
User.SampleCode.FPM.Search_CorrelationEdge(1,2) edges=101 execute. 5.046 msec, count=3
【パラメータ調整】
項目 | 値 | メンバ |
---|---|---|
局所領域サイズ(横方向) | 17 | RegionWidth |
局所領域サイズ(縦方向) | 5 | RegionHeight |
非極大抑制処理のフィルタ片幅 | 6 | NmsLength |
ソースコード:
上記 1) の処理は、下記の関数に引数 0,1 を指定して実行したものです。 2) の処理は、引数 1,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 FPM { /// <summary> /// 0,0:clip,WxH=13x5,Nms=6 /// </summary> [FvPluginExecute] public void Search_CorrelationEdge00() { Search_CorrelationEdge(0, 0); // 0,0:clip,WxH=13x5,Nms=6 } /// <summary> /// 0,1:clip,WxH=3x3,Nms=1 /// </summary> [FvPluginExecute] public void Search_CorrelationEdge01() { Search_CorrelationEdge(0, 1); // 0,1:clip,WxH=3x3,Nms=1 } /// <summary> /// 1,0:key,WxH=13x5,Nms=6 /// </summary> [FvPluginExecute] public void Search_CorrelationEdge10() { Search_CorrelationEdge(1, 0); // 1,0:key,WxH=13x5,Nms=6 } /// <summary> /// 1,2:key,WxH=17x5,Nms=6 /// </summary> [FvPluginExecute] public void Search_CorrelationEdge12() { Search_CorrelationEdge(1, 2); // 1,2:key,WxH=17x5,Nms=6 } /// <summary> /// マッチング実行 (相関エッジ) /// </summary> /// <param name="target">0=clip、1=key1</param> /// <param name="option">0=13x5(Nms=6)、1=3x3(Nms=1)、2=17x5(Nms=6)</param> public void Search_CorrelationEdge(int target, int option) { System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); Console.WriteLine("{0}.{1}({2},{3})", method.DeclaringType.FullName, method.Name, target, option); // 1) インスタンスの準備. FVIL.FPM.CFviFPMCorrelationEdge parser = new FVIL.FPM.CFviFPMCorrelationEdge(); FVIL.Data.CFviImage src = new FVIL.Data.CFviImage(); FVIL.Data.CFviPattern pattern = new FVIL.Data.CFviPattern(); // 2-1) 処理対象画像の取り込み. System.String[] szSrcFile = { Defs.TestImageDir + "/clip_UC8_M.png", Defs.TestImageDir + "/key_UC8_M.png", }; FVIL.File.Function.LoadImageFile( szSrcFile[target], src, FVIL.PixelMode.Unpacking ); // 2-2) パタン画像の読み込み. System.String[] szPatFile = { Defs.TestImageDir + "/clip.pat", Defs.TestImageDir + "/key1.pat", }; pattern.Load( szPatFile[target] ); // 3) 処理対象画像の有効性検査. if( FVIL.ErrorCode._SUCCESS != FVIL.FPM.CFviFPMCorrelationEdge.CheckValidity( src ) ) return; if( FVIL.ErrorCode._SUCCESS != FVIL.FPM.CFviFPMCorrelationEdge.CheckValidity( pattern ) ) return; // 4) 画像処理準備. // --- 処理対象画像と結果格納用オブジェクトの設定. parser.SrcImages[0] = src; // // ※パラメータを既定値から変更した部分は、コメントに [*] を記述しています. // // 5-1) パラメータ設定 (本体) parser.ExecuteFlag = FVIL.FPM.ExecuteFlag.On; // [ ] 高精度ポーズ推定 (1:行う) // [ ] 領域スコア算出 (0:行わない) parser.ExecuteAreaScoreFlag = FVIL.FPM.ExecuteAreaScoreFlag.Off; parser.MatchMode = FVIL.FPM.MatchMode.HighSpeed; // [*] 処理モード (1:高速モード) // [ ] 回答基準点自動取得の実行指示 (0:手動) parser.CenterMarkAutoFlag = FVIL.FPM.CenterMarkAutoFlag.Manual; // 5-2) パラメータ設定 (基本) FVIL.FPM.CFviFPMParam param = parser.Param; param.Count = 10; // [*] 検索個数. param.AngleMin = new FVIL.Data.CFviAngle(-180); // [ ] 回転角(下限) param.AngleMax = new FVIL.Data.CFviAngle(180); // [ ] 回転角(上限) param.ScaleMin = 100; // [ ] スケール(下限) (%) param.ScaleMax = 100; // [ ] スケール(上限) (%) param.CompressionLevel = 3; // [ ] 圧縮レベル (3: 1/8) param.ErrorRange = 1; // [ ] 誤差範囲 (画素) param.ScoreThresholdL = 50; // [ ] 低圧縮処理時のスコア閾値. param.ScoreThresholdH = 50; // [ ] 高圧縮処理時のスコア閾値. // 5-3) パラメータ設定 (高精度ポーズ推定用) FVIL.FPM.CFviFPMParamRefine paramR = parser.ParamRefine; paramR.ErrorRange = 1; // [ ] 誤差範囲 (画素) paramR.ScoreThreshold = 60; // [ ] スコア閾値 (高精度ポーズ推定時) // 5-4) パラメータ設定 (領域スコア算出用) FVIL.FPM.CFviFPMParamAreaScore paramA = parser.ParamAreaScore; paramA.ErrorRangeTx = 0.5; // [ ] 誤差範囲(X方向並進値) (画素) paramA.ErrorRangeTy = 0.5; // [ ] 誤差範囲(Y方向並進値) (画素) paramA.ErrorRangeTq = 0.5; // [ ] 誤差範囲(回転角) (度) paramA.ErrorRangeTs = 0.5; // [ ] 誤差範囲(スケール) (%) paramA.ErrorRange = 1; // [ ] 誤差範囲 (画素) paramA.NoiseWeight = 0.2; // [ ] ノイズデータ重み係数. paramA.ScoreThreshold = 60; // [ ] スコア閾値 (領域スコア算出時) // 5-5) パラメータ設定 (エッジ検出処理用) FVIL.FPM.CFviFPMParamCorrelationEdge paramE = parser.ParamEdge; paramE.RegionWidth = 13; // [ ] 局所領域サイズ(横方向) paramE.RegionHeight = 5; // [ ] 局所領域サイズ(縦方向) paramE.SigmoidK = 1.0; // [ ] シグモイド関数パラメータ. paramE.VarThreshold = 25.0; // [ ] 分散閾値. paramE.EdgeThreshold = 160; // [ ] エッジ強度値に対する閾値. paramE.NmsLength = 6; // [ ] 非極大抑制処理のフィルタ片幅. switch( option ) { case 0: // default break; case 1: // WxH=3x3,Nms=1 (線幅が細い画像) paramE.RegionWidth = 3; // [*] 局所領域サイズ(横方向) paramE.RegionHeight = 3; // [*] 局所領域サイズ(縦方向) paramE.NmsLength = 1; // [*] 非極大抑制処理のフィルタ片幅. break; case 2: // WxH=17x5,Nms=6 (線幅が太い画像) paramE.RegionWidth = 17; // [*] 局所領域サイズ(横方向) paramE.RegionHeight = 5; // [ ] 局所領域サイズ(縦方向) paramE.NmsLength = 6; // [ ] 非極大抑制処理のフィルタ片幅. break; } // 5-E) サーチパタンのオープン. parser.OpenPattern( pattern ); // 確認用) パタンのエッジ点. { List<FVIL.Edge.CFviEdgeData> edges = parser.GetPatternEdges(); Console.WriteLine("edges={0}", edges.Count); } // 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) 確認用. System.String filename = Defs.ResultDir + "/" + System.String.Format("FPM.Search_CorrelationEdge-{0}_{1}.png", target, option); SaveResult(src, pattern, parser.Result, filename); } }; } |
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 FPM ''' <summary> ''' 0,0:clip,WxH=13x5,Nms=6 ''' </summary> <FvPluginExecute> _ Public Sub Search_CorrelationEdge00() Search_CorrelationEdge(0, 0) ' 0,0:clip,WxH=13x5,Nms=6 End Sub ''' <summary> ''' 0,1:clip,WxH=3x3,Nms=1 ''' </summary> <FvPluginExecute> _ Public Sub Search_CorrelationEdge01() Search_CorrelationEdge(0, 1) ' 0,1:clip,WxH=3x3,Nms=1 End Sub ''' <summary> ''' 1,0:key,WxH=13x5,Nms=6 ''' </summary> <FvPluginExecute> _ Public Sub Search_CorrelationEdge10() Search_CorrelationEdge(1, 0) ' 1,0:key,WxH=13x5,Nms=6 End Sub ''' <summary> ''' 1,2:key,WxH=17x5,Nms=6 ''' </summary> <FvPluginExecute> _ Public Sub Search_CorrelationEdge12() Search_CorrelationEdge(1, 2) ' 1,2:key,WxH=17x5,Nms=6 End Sub ''' <summary> ''' マッチング実行 (相関エッジ) ''' </summary> ''' <param name="target">0=clip、1=key1</param> ''' <param name="option">0=13x5(Nms=6)、1=3x3(Nms=1)、2=17x5(Nms=6)</param> Public Sub Search_CorrelationEdge(target As Integer, [option] As Integer) Dim method As System.Reflection.MethodBase = System.Reflection.MethodBase.GetCurrentMethod() Console.WriteLine("{0}.{1}({2},{3})", method.DeclaringType.FullName, method.Name, target, [option]) ' 1) インスタンスの準備. Dim parser As New FVIL.FPM.CFviFPMCorrelationEdge() Dim src As New FVIL.Data.CFviImage() Dim pattern As New FVIL.Data.CFviPattern() ' 2-1) 処理対象画像の取り込み. Dim szSrcFile As System.String() = {Defs.TestImageDir & "/clip_UC8_M.png", Defs.TestImageDir & "/key_UC8_M.png"} FVIL.File.[Function].LoadImageFile(szSrcFile(target), src, FVIL.PixelMode.Unpacking) ' 2-2) パタン画像の読み込み. Dim szPatFile As System.String() = {Defs.TestImageDir & "/clip.pat", Defs.TestImageDir & "/key1.pat"} pattern.Load(szPatFile(target)) ' 3) 処理対象画像の有効性検査. If FVIL.ErrorCode._SUCCESS <> FVIL.FPM.CFviFPMCorrelationEdge.CheckValidity(src) Then Return End If If FVIL.ErrorCode._SUCCESS <> FVIL.FPM.CFviFPMCorrelationEdge.CheckValidity(pattern) Then Return End If ' 4) 画像処理準備. ' --- 処理対象画像と結果格納用オブジェクトの設定. parser.SrcImages(0) = src ' ' ※パラメータを既定値から変更した部分は、コメントに [*] を記述しています. ' ' 5-1) パラメータ設定 (本体) parser.ExecuteFlag = FVIL.FPM.ExecuteFlag.[On] ' [ ] 高精度ポーズ推定 (1:行う) ' [ ] 領域スコア算出 (0:行わない) parser.ExecuteAreaScoreFlag = FVIL.FPM.ExecuteAreaScoreFlag.Off parser.MatchMode = FVIL.FPM.MatchMode.HighSpeed ' [*] 処理モード (1:高速モード) ' [ ] 回答基準点自動取得の実行指示 (0:手動) parser.CenterMarkAutoFlag = FVIL.FPM.CenterMarkAutoFlag.Manual ' 5-2) パラメータ設定 (基本) Dim param As FVIL.FPM.CFviFPMParam = parser.Param param.Count = 10 ' [*] 検索個数. param.AngleMin = New FVIL.Data.CFviAngle(-180) ' [ ] 回転角(下限) param.AngleMax = New FVIL.Data.CFviAngle(180) ' [ ] 回転角(上限) param.ScaleMin = 100 ' [ ] スケール(下限) (%) param.ScaleMax = 100 ' [ ] スケール(上限) (%) param.CompressionLevel = 3 ' [ ] 圧縮レベル (3: 1/8) param.ErrorRange = 1 ' [ ] 誤差範囲 (画素) param.ScoreThresholdL = 50 ' [ ] 低圧縮処理時のスコア閾値. param.ScoreThresholdH = 50 ' [ ] 高圧縮処理時のスコア閾値. ' 5-3) パラメータ設定 (高精度ポーズ推定用) Dim paramR As FVIL.FPM.CFviFPMParamRefine = parser.ParamRefine paramR.ErrorRange = 1 ' [ ] 誤差範囲 (画素) paramR.ScoreThreshold = 60 ' [ ] スコア閾値 (高精度ポーズ推定時) ' 5-4) パラメータ設定 (領域スコア算出用) Dim paramA As FVIL.FPM.CFviFPMParamAreaScore = parser.ParamAreaScore paramA.ErrorRangeTx = 0.5 ' [ ] 誤差範囲(X方向並進値) (画素) paramA.ErrorRangeTy = 0.5 ' [ ] 誤差範囲(Y方向並進値) (画素) paramA.ErrorRangeTq = 0.5 ' [ ] 誤差範囲(回転角) (度) paramA.ErrorRangeTs = 0.5 ' [ ] 誤差範囲(スケール) (%) paramA.ErrorRange = 1 ' [ ] 誤差範囲 (画素) paramA.NoiseWeight = 0.2 ' [ ] ノイズデータ重み係数. paramA.ScoreThreshold = 60 ' [ ] スコア閾値 (領域スコア算出時) ' 5-5) パラメータ設定 (エッジ検出処理用) Dim paramE As FVIL.FPM.CFviFPMParamCorrelationEdge = parser.ParamEdge paramE.RegionWidth = 13 ' [ ] 局所領域サイズ(横方向) paramE.RegionHeight = 5 ' [ ] 局所領域サイズ(縦方向) paramE.SigmoidK = 1.0 ' [ ] シグモイド関数パラメータ. paramE.VarThreshold = 25.0 ' [ ] 分散閾値. paramE.EdgeThreshold = 160 ' [ ] エッジ強度値に対する閾値. paramE.NmsLength = 6 ' [ ] 非極大抑制処理のフィルタ片幅. Select Case [option] Case 0 ' default Exit Select Case 1 ' WxH=3x3,Nms=1 (線幅が細い画像) paramE.RegionWidth = 3 ' [*] 局所領域サイズ(横方向) paramE.RegionHeight = 3 ' [*] 局所領域サイズ(縦方向) paramE.NmsLength = 1 ' [*] 非極大抑制処理のフィルタ片幅. Exit Select Case 2 ' WxH=17x5,Nms=6 (線幅が太い画像) paramE.RegionWidth = 17 ' [*] 局所領域サイズ(横方向) paramE.RegionHeight = 5 ' [ ] 局所領域サイズ(縦方向) paramE.NmsLength = 6 ' [ ] 非極大抑制処理のフィルタ片幅. Exit Select End Select ' 5-E) サーチパタンのオープン. parser.OpenPattern(pattern) ' 確認用) パタンのエッジ点. If True Then Dim edges As List(Of FVIL.Edge.CFviEdgeData) = parser.GetPatternEdges() Console.WriteLine("edges={0}", edges.Count) End If ' 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) 確認用. Dim filename As System.String = Defs.ResultDir & "/" & System.[String].Format("FPM.Search_CorrelationEdge-{0}_{1}.png", target, [option]) SaveResult(src, pattern, parser.Result, filename) End Sub End Class End Namespace |
Inheritance Hierarchy
System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.FPM..::..CFviFPM
FVIL.FPM..::..CFviFPMCorrelationEdge
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.FPM..::..CFviFPM
FVIL.FPM..::..CFviFPMCorrelationEdge