点群マッチング後の座標値および誤差の算出

Namespace: fvalgcli
Assembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)

Syntax

C#
public static int fnFIE_pfit_points(
	int iPntNum,
	DPNT_T_PTR taWork,
	DPNT_T_PTR taMaster,
	double dSigmaCoef,
	f_pfit_calc_mode iCalcMode,
	DPNT_T_PTR taConv,
	DOUBLE_PTR daErr
)
Visual Basic
Public Shared Function fnFIE_pfit_points ( 
	iPntNum As Integer,
	taWork As DPNT_T_PTR,
	taMaster As DPNT_T_PTR,
	dSigmaCoef As Double,
	iCalcMode As f_pfit_calc_mode,
	taConv As DPNT_T_PTR,
	daErr As DOUBLE_PTR
) As Integer

Parameters

iPntNum
Type: System..::..Int32
データ(座標)点の数(2点以上)
taWork
Type: fvalgcli..::..DPNT_T_PTR
ワーク点群座標データ(合わされる方)
taMaster
Type: fvalgcli..::..DPNT_T_PTR
マスタ点群座標データ(合わせる方)
dSigmaCoef
Type: System..::..Double
ロバスト推定用重み閾値の係数
iCalcMode
Type: fvalgcli..::..f_pfit_calc_mode
処理選択
  • F_PFIT_LSQ 最小二乗法:スケール推定なし
  • F_PFIT_LSQ_SCALE 最小二乗法:スケール推定あり
  • F_PFIT_RBST ロバスト推定:スケール推定なし
  • F_PFIT_RBST_SCALE ロバスト推定:スケール推定あり
  • F_PFIT_MINMAX ミニマックス近似:スケール推定なし
  • F_PFIT_MINMAX_SCALE ミニマックス近似:スケール推定あり
taConv
Type: fvalgcli..::..DPNT_T_PTR
マッチング後のマスタ点群の座標(taMaster[] と同じでもよい)
daErr
Type: fvalgcli..::..DOUBLE_PTR
マッチング後の対応する2点間の距離(誤差)

Return Value

Type: Int32
以下のエラーコードを返します。

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_NOMEMORY メモリ確保失敗
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_CALC_IMPOSSIBLE ロバスト推定失敗(重み閾値が小さくなりすぎた)または ミニマックス近似失敗(反復回数オーバー)
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Remarks

Examples

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace TC
{
    public partial class FIE
    {
        [FvPluginExecute]
        public void fnFIE_pfit_points()
        {
            int status = (int)f_err.F_ERR_NONE;

            // 点列(変換前と変換後).
            DPNT_T_PTR taWork = DPNT_T_PTR.Zero;
            DPNT_T_PTR taMaster = DPNT_T_PTR.Zero;
            DPNT_T_PTR taConv = DPNT_T_PTR.Zero;
            int num = 4;    // 点列数.

            // 変換行列.
            FMATRIX_PTR mat_rotate = FMATRIX_PTR.Zero;
            FMATRIX_PTR mat_scale = FMATRIX_PTR.Zero;
            FMATRIX_PTR mat = FMATRIX_PTR.Zero;

            // 変換行列生成用パラメータ(回転).
            double rad = Math.PI / 2;
            double cx = 75;
            double cy = 75;

            // 変換行列生成用パラメータ(スケール).
            double sx = 2.0;
            double sy = 2.0;

            // 変換パラメータ [out].
            DOUBLE_PTR daErr = DOUBLE_PTR.Zero;

            try
            {
                // 行列の領域確保.
                mat_rotate = FMATRIX_PTR.alloc(3, 3);
                mat_scale = FMATRIX_PTR.alloc(3, 3);
                mat = FMATRIX_PTR.alloc(3, 3);

                // 点列の領域を確保.
                taWork = DPNT_T_PTR.alloc(num);
                taMaster = DPNT_T_PTR.alloc(num);
                taConv = DPNT_T_PTR.alloc(num);
                daErr = DOUBLE_PTR.alloc(num);

                // 回転及びスケールの変換行列を求める.
                api.fnFIE_geotrans_calc_rotate_matrix(mat_rotate, rad, cx, cy);
                api.fnFIE_geotrans_calc_scale_matrix(mat_scale, sx, sy);

                // 行列を掛け,1つの行列にまとめる.
                api.fnFIE_mat_mul_aa(mat_scale, mat_rotate, mat);

                // Workの座標を指定する.
                taWork[0] = DPNT_T.init(50, 50);
                taWork[1] = DPNT_T.init(100, 50);
                taWork[2] = DPNT_T.init(50, 100);
                taWork[3] = DPNT_T.init(100, 100);

                // 点列をアフィン変換して新座標系での点群とする.
                api.fnFIE_geotrans_affine_npoints(taWork, taMaster, num, mat);

                // 点群マッチングによる座標系パラメータ(原点座標,傾きおよびスケール)の算出.
                status = api.fnFIE_pfit_points(num, taWork, taMaster, 3, f_pfit_calc_mode.F_PFIT_RBST_SCALE,
                                               taConv, daErr);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 結果を出力する.
                ConsoleOut.WriteFunctionName(":\n");
                for( int i = 0; i < num ; i++)
                {
                    Console.WriteLine(" taConv[{3}].x = {0}, taConv[{3}].y = {1}, daErr[{3}] = {2}", taConv[i].x, taConv[i].y, daErr[i], i);
                }
                Console.Write(" ...");
                ConsoleOut.IsTrue(DblEqual(daErr[0], 0) && DblEqual(daErr[1], 0) && DblEqual(daErr[2], 0) && DblEqual(daErr[3], 0));
            }
            finally
            {
                mat_rotate.Dispose();
                mat_scale.Dispose();
                mat.Dispose();
                taWork.Dispose();
                taMaster.Dispose();
                taConv.Dispose();
                daErr.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Public Partial Class FIE
    <FvPluginExecute> _
    Public Sub fnFIE_pfit_points()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        ' 点列(変換前と変換後).
        Dim taWork As DPNT_T_PTR = DPNT_T_PTR.Zero
        Dim taMaster As DPNT_T_PTR = DPNT_T_PTR.Zero
        Dim taConv As DPNT_T_PTR = DPNT_T_PTR.Zero
        Dim num As Integer = 4
        ' 点列数.
        ' 変換行列.
        Dim mat_rotate As FMATRIX_PTR = FMATRIX_PTR.Zero
        Dim mat_scale As FMATRIX_PTR = FMATRIX_PTR.Zero
        Dim mat As FMATRIX_PTR = FMATRIX_PTR.Zero

        ' 変換行列生成用パラメータ(回転).
        Dim rad As Double = Math.PI / 2
        Dim cx As Double = 75
        Dim cy As Double = 75

        ' 変換行列生成用パラメータ(スケール).
        Dim sx As Double = 2.0
        Dim sy As Double = 2.0

        ' 変換パラメータ [out].
        Dim daErr As DOUBLE_PTR = DOUBLE_PTR.Zero

        Try
            ' 行列の領域確保.
            mat_rotate = FMATRIX_PTR.alloc(3, 3)
            mat_scale = FMATRIX_PTR.alloc(3, 3)
            mat = FMATRIX_PTR.alloc(3, 3)

            ' 点列の領域を確保.
            taWork = DPNT_T_PTR.alloc(num)
            taMaster = DPNT_T_PTR.alloc(num)
            taConv = DPNT_T_PTR.alloc(num)
            daErr = DOUBLE_PTR.alloc(num)

            ' 回転及びスケールの変換行列を求める.
            api.fnFIE_geotrans_calc_rotate_matrix(mat_rotate, rad, cx, cy)
            api.fnFIE_geotrans_calc_scale_matrix(mat_scale, sx, sy)

            ' 行列を掛け,1つの行列にまとめる.
            api.fnFIE_mat_mul_aa(mat_scale, mat_rotate, mat)

            ' Workの座標を指定する.
            taWork(0) = DPNT_T.init(50, 50)
            taWork(1) = DPNT_T.init(100, 50)
            taWork(2) = DPNT_T.init(50, 100)
            taWork(3) = DPNT_T.init(100, 100)

            ' 点列をアフィン変換して新座標系での点群とする.
            api.fnFIE_geotrans_affine_npoints(taWork, taMaster, num, mat)

            ' 点群マッチングによる座標系パラメータ(原点座標,傾きおよびスケール)の算出.
            status = api.fnFIE_pfit_points(num, taWork, taMaster, 3, f_pfit_calc_mode.F_PFIT_RBST_SCALE, taConv, _
                daErr)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 結果を出力する.
            ConsoleOut.WriteFunctionName(":" & vbLf)
            For i As Integer = 0 To num - 1
                Console.WriteLine(" taConv[{3}].x = {0}, taConv[{3}].y = {1}, daErr[{3}] = {2}", taConv(i).x, taConv(i).y, daErr(i), i)
            Next
            Console.Write(" ...")
            ConsoleOut.IsTrue(DblEqual(daErr(0), 0) AndAlso DblEqual(daErr(1), 0) AndAlso DblEqual(daErr(2), 0) AndAlso DblEqual(daErr(3), 0))
        Finally
            mat_rotate.Dispose()
            mat_scale.Dispose()
            mat.Dispose()
            taWork.Dispose()
            taMaster.Dispose()
            taConv.Dispose()
            daErr.Dispose()
        End Try
    End Sub
End Class

See Also