点群マッチングの変換パラメータ(重心,回転角およびスケール)算出

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

Syntax

C#
[SerializableAttribute]
public class CFviPfitParam : CFviObject, 
	IFviCopyable, ICloneable
Visual Basic
<SerializableAttribute>
Public Class CFviPfitParam
	Inherits CFviObject
	Implements IFviCopyable, ICloneable

Remarks

同一座標系上の点群に対し、最小二乗法、ロバスト推定 または ミニマックス近似 により、 Master 点群を Work 点群にマッチングします。 その際、Master 点群と Work 点群の各点は配列要素順に対応づけがあるものとします。 結果出力は,マッチング後の Master 点群の重心と、その周りの回転角およびスケール(相似比)です。

ロバスト推定用重み閾値の係数は、入力データの誤差(ばらつき)の標準偏差に掛ける係数を入力します。 例えば、3σを閾値にする場合はσの係数である'3'を入力します。

ミニマックス近似では、各対応点の距離(誤差)の最大値が最も小さくなるように合わせ込みを行います。


入力データ:

このクラスでは、入力データは Execute(DPNT_T_ARRAY, DPNT_T_ARRAY, Double, PfitCalcMode) メソッドの引数に指定します。

引数範囲説明
old_points2点以上旧座標系上の座標値群(合わされる方)
new_points2点以上新座標系上の座標値群(合わせる方)
sigma_coefロバスト推定用重み閾値の係数
calc_modePfitCalcMode に定義された定数処理選択

出力データ:

出力データは Execute(DPNT_T_ARRAY, DPNT_T_ARRAY, Double, PfitCalcMode) メソッドを実行後、下記のプロパティに設定されます。 Reset()()()() を実行すると、0 初期化されます。

プロパティ初期値範囲説明
XcOrg0元の(マッチング前の)マスタ点群の重心x座標
YcOrg0元の(マッチング前の)マスタ点群の重心y座標
Xc0マッチング後のマスタ点群の重心x座標
Yc0マッチング後のマスタ点群の重心y座標
Theta0rad:[-π,π]マスタ点群の重心周りの回転角
Scale0 マスタ点群のスケール(相似比)
処理選択で'スケール推定なし'を選択した場合は、1.0 が返ります。

関連する FIE 関数:

fnFIE_pfit_param

Examples

ソースコード:
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode
{
    public partial class CG
    {
        /// <summary>
        /// 点群マッチングの変換パラメータ(重心,回転角およびスケール)算出.
        /// </summary>
        [FvPluginExecute]
        public void PfitParam()
        {
            // 0) 点群の準備.
            FVIL.Data.CFviImage src1 = new FVIL.Data.CFviImage();
            FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/CG_base.bmp", src1, FVIL.PixelMode.Unpacking);

            FVIL.Data.CFviImage src2 = new FVIL.Data.CFviImage();
            FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/CG_target.bmp", src2, FVIL.PixelMode.Unpacking);

            FVIL.Edge.CFviEdgeResultI32 result1 = new FVIL.Edge.CFviEdgeResultI32();
            FVIL.Edge.CFviEdgeResultI32 result2 = new FVIL.Edge.CFviEdgeResultI32();

            FVIL.Edge.CFviEdge2DSobelParam param = new FVIL.Edge.CFviEdge2DSobelParam();
            param.EdgeThreshold = 120;
            param.NmsLength = 1;

            GetEdgePoints(src1, param, result1);
            GetEdgePoints(src2, param, result2);

            FVIL.DPNT_T_ARRAY old_points = result1.ToDPNT_T_ARRAY();
            FVIL.DPNT_T_ARRAY new_points = result2.ToDPNT_T_ARRAY();


            // 1) インスタンスの準備.
            FVIL.CG.CFviPfitParam parser = new FVIL.CG.CFviPfitParam();


            // 2) 処理実行.
            parser.Execute(old_points, new_points, 3.0, FVIL.CG.PfitCalcMode.RBST_FAST);

            // E) 確認.
            Console.Out.WriteLine("-- PfitParam");

            Console.Out.WriteLine(" (XcOrg, YcOrg) = ({0:f},{1:f}), (Xc, Yc) = ({2:f},{3:f}), Theta = {4:f}[deg], Scale = {5:f}",
                parser.XcOrg, parser.YcOrg, parser.Xc, parser.Yc, FVIL.Data.CFviAngle.FromRadian(parser.Theta).Degree, parser.Scale);
        }
    }
}


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

Namespace SampleCode
    Public Partial Class CG
        ''' <summary>
        ''' 点群マッチングの変換パラメータ(重心,回転角およびスケール)算出.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub PfitParam()
            ' 0) 点群の準備.
            Dim src1 As New FVIL.Data.CFviImage()
            FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/CG_base.bmp", src1, FVIL.PixelMode.Unpacking)

            Dim src2 As New FVIL.Data.CFviImage()
            FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/CG_target.bmp", src2, FVIL.PixelMode.Unpacking)

            Dim result1 As New FVIL.Edge.CFviEdgeResultI32()
            Dim result2 As New FVIL.Edge.CFviEdgeResultI32()

            Dim param As New FVIL.Edge.CFviEdge2DSobelParam()
            param.EdgeThreshold = 120
            param.NmsLength = 1

            GetEdgePoints(src1, param, result1)
            GetEdgePoints(src2, param, result2)

            Dim old_points As FVIL.DPNT_T_ARRAY = result1.ToDPNT_T_ARRAY()
            Dim new_points As FVIL.DPNT_T_ARRAY = result2.ToDPNT_T_ARRAY()


            ' 1) インスタンスの準備.
            Dim parser As New FVIL.CG.CFviPfitParam()


            ' 2) 処理実行.
            parser.Execute(old_points, new_points, 3.0, FVIL.CG.PfitCalcMode.RBST_FAST)

            ' E) 確認.
            Console.Out.WriteLine("-- PfitParam")

            Console.Out.WriteLine(" (XcOrg, YcOrg) = ({0:f},{1:f}), (Xc, Yc) = ({2:f},{3:f}), Theta = {4:f}[deg], Scale = {5:f}", parser.XcOrg, parser.YcOrg, parser.Xc, parser.Yc, FVIL.Data.CFviAngle.FromRadian(parser.Theta).Degree, _
                parser.Scale)
        End Sub
    End Class
End Namespace
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode
{
    public partial class CG
    {
        /// <summary>
        /// 2次元エッジ検出による点群の取得.
        /// </summary>
        private void GetEdgePoints(FVIL.Data.CFviImage src,
                                    FVIL.Data.CFviDataObject param, FVIL.Edge.CFviEdgeResultI32 result)
        {
            // 1) インスタンスの準備.
            FVIL.Edge.CFviEdge2D parser = new FVIL.Edge.CFviEdge2D();
            FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage();

            // 2) 処理対象画像の有効性検査.
            int valid = FVIL.Edge.CFviEdge2D.CheckValidity(src);
            if (valid != FVIL.ErrorCode._SUCCESS)
                throw new FVIL.CFviException(valid, "FVIL.Edge.CFviEdge2D.CheckValidity");

            // 3) 画像処理準備 (共通)
            parser.SrcImages[0] = src;
            parser.DstImages[0] = dst;
            if (!parser.IsValid())    // 有効性検査.
                parser.Validate();    // 有効化.
            parser.Result = result;

            // 4-1) パラメータ設定 (継承)
            parser.BorderMode = FVIL.BorderMode.None;
            parser.MagMode = FVIL.Edge.MagMode.XY;
            parser.SaveMode = FVIL.Edge.SaveMode.Mag | FVIL.Edge.SaveMode.Direct;

            // 4-2) パラメータ設定 (固有)
            parser.Param = param;

            // 5) 画像処理実行.
            parser.Execute();
        }    
    }
}


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

Namespace SampleCode
    Public Partial Class CG
        ''' <summary>
        ''' 2次元エッジ検出による点群の取得.
        ''' </summary>
        Private Sub GetEdgePoints(src As FVIL.Data.CFviImage, param As FVIL.Data.CFviDataObject, result As FVIL.Edge.CFviEdgeResultI32)
            ' 1) インスタンスの準備.
            Dim parser As New FVIL.Edge.CFviEdge2D()
            Dim dst As New FVIL.Data.CFviImage()

            ' 2) 処理対象画像の有効性検査.
            Dim valid As Integer = FVIL.Edge.CFviEdge2D.CheckValidity(src)
            If valid <> FVIL.ErrorCode._SUCCESS Then
                Throw New FVIL.CFviException(valid, "FVIL.Edge.CFviEdge2D.CheckValidity")
            End If

            ' 3) 画像処理準備 (共通)
            parser.SrcImages(0) = src
            parser.DstImages(0) = dst
            If Not parser.IsValid() Then
                ' 有効性検査.
                parser.Validate()
            End If
            ' 有効化.
            parser.Result = result

            ' 4-1) パラメータ設定 (継承)
            parser.BorderMode = FVIL.BorderMode.None
            parser.MagMode = FVIL.Edge.MagMode.XY
            parser.SaveMode = FVIL.Edge.SaveMode.Mag Or FVIL.Edge.SaveMode.Direct

            ' 4-2) パラメータ設定 (固有)
            parser.Param = param

            ' 5) 画像処理実行.
            parser.Execute()
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL.CG..::..CFviPfitParam

See Also