特徴点応用マッチングクラス(ソーベルフィルタ)

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

Syntax

C#
[SerializableAttribute]
public class CFviFPMSobel : CFviFPM
Visual Basic
<SerializableAttribute>
Public Class CFviFPMSobel
	Inherits CFviFPM

Remarks

画像とテンプレートの特徴点およびエッジ点のマッチングを行ないます。 このクラスは、特徴点の抽出にソーベルフィルタを使用します。


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

処理対象画像の条件:

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

  • 画像種別が FVIL.ImageType.UC8 である事 -
  • チャネル数が 1 である事 -
  • 画像領域のX方向メモリサイズ(バイト数)が8の倍数である事 -

初期値と範囲:
プロパティ初期値範囲
ParamEdgeCFviFPMParamSobel の初期値※インスタンスの差し替えはできません。

Examples

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


1) 線幅が細い画像


【パタン画像】


【関数の出力】
User.SampleCode.FPM.Search_Sobel(0,0)
edges=163
execute. 30.706 msec, count=7 

2) 線幅が太い画像


【パタン画像】


【関数の出力】
User.SampleCode.FPM.Search_Sobel(1,0)
edges=220
execute. 13.418 msec, count=2 

ソースコード:

上記 1) の処理は、下記の関数に引数 0,0 を指定して実行したものです。 2) の処理は、引数 1,0 を指定して実行したものです。

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 FPM
    {
        /// <summary>
        /// 0,0:clip,Nms=3
        /// </summary>
        [FvPluginExecute]
        public void Search_Sobel00()
        {
            Search_Sobel(0, 0);                // 0,0:clip,Nms=3
        }

        /// <summary>
        /// 1,0:key,Nms=3
        /// </summary>
        [FvPluginExecute]
        public void Search_Sobel10()
        {
            Search_Sobel(1, 0);                // 1,0:key,Nms=3
        }

        /// <summary>
        /// マッチング実行 (ソーベル)
        /// </summary>
        /// <param name="target">0=clip、1=key1</param>
        /// <param name="option">0=(Nms=3)、1=(Nms=7)</param>
        public void Search_Sobel(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.CFviFPMSobel parser = new FVIL.FPM.CFviFPMSobel();
            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.CFviFPMSobel.CheckValidity( src ) ) return;
            if( FVIL.ErrorCode._SUCCESS != FVIL.FPM.CFviFPMSobel.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.CFviFPMParamSobel paramE = parser.ParamEdge;
            paramE.EdgeThreshold = 120;                    // [ ] エッジ強度値に対する閾値.
            paramE.NmsLength = 3;                        // [ ] 非極大抑制処理のフィルタ片幅.

            switch( option )
            {
                case 0:        // Nms=3
                    break;
                case 1:        // Nms=7
                    paramE.NmsLength = 7;                // [*] 非極大抑制処理のフィルタ片幅.
                    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_Sobel-{0}_{1}.png", target, option);
            SaveResult(src, pattern, parser.Result, filename);
        }
    };
}


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 FPM
        ''' <summary>
        ''' 0,0:clip,Nms=3
        ''' </summary>
        <FvPluginExecute> _
        Public Sub Search_Sobel00()
            Search_Sobel(0, 0)
            ' 0,0:clip,Nms=3
        End Sub

        ''' <summary>
        ''' 1,0:key,Nms=3
        ''' </summary>
        <FvPluginExecute> _
        Public Sub Search_Sobel10()
            Search_Sobel(1, 0)
            ' 1,0:key,Nms=3
        End Sub

        ''' <summary>
        ''' マッチング実行 (ソーベル)
        ''' </summary>
        ''' <param name="target">0=clip、1=key1</param>
        ''' <param name="option">0=(Nms=3)、1=(Nms=7)</param>
        Public Sub Search_Sobel(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.CFviFPMSobel()
            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.CFviFPMSobel.CheckValidity(src) Then
                Return
            End If
            If FVIL.ErrorCode._SUCCESS <> FVIL.FPM.CFviFPMSobel.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.CFviFPMParamSobel = parser.ParamEdge
            paramE.EdgeThreshold = 120
            ' [ ] エッジ強度値に対する閾値.
            paramE.NmsLength = 3
            ' [ ] 非極大抑制処理のフィルタ片幅.
            Select Case [option]
                Case 0
                    ' Nms=3
                    Exit Select
                Case 1
                    ' Nms=7
                    paramE.NmsLength = 7
                    ' [*] 非極大抑制処理のフィルタ片幅.
                    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_Sobel-{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..::..CFviFPMSobel

See Also