点群マッチングの変換パラメータ(重心,回転角およびスケール)算出
Namespace: FVIL.CGAssembly: 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_points | 2点以上 | 旧座標系上の座標値群(合わされる方) |
new_points | 2点以上 | 新座標系上の座標値群(合わせる方) |
sigma_coef | ロバスト推定用重み閾値の係数 | |
calc_mode | PfitCalcMode に定義された定数 | 処理選択 |
出力データ:
出力データは Execute(DPNT_T_ARRAY, DPNT_T_ARRAY, Double, PfitCalcMode) メソッドを実行後、下記のプロパティに設定されます。 Reset()()()() を実行すると、0 初期化されます。
プロパティ | 初期値 | 範囲 | 説明 |
---|---|---|---|
XcOrg | 0 | 元の(マッチング前の)マスタ点群の重心x座標 | |
YcOrg | 0 | 元の(マッチング前の)マスタ点群の重心y座標 | |
Xc | 0 | マッチング後のマスタ点群の重心x座標 | |
Yc | 0 | マッチング後のマスタ点群の重心y座標 | |
Theta | 0 | rad:[-π,π] | マスタ点群の重心周りの回転角 |
Scale | 0 |
マスタ点群のスケール(相似比) 処理選択で'スケール推定なし'を選択した場合は、1.0 が返ります。 |
関連する FIE 関数:
fnFIE_pfit_param
Examples
ソースコード:
C# | Copy |
---|---|
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 |
---|---|
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 |
---|---|
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 |
---|---|
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 |