点群からの円近似

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

Syntax

C#
public static CFviCircle FitCircle(
	DPNT_T_ARRAY points,
	FitMode fit_mode,
	double param
)
Visual Basic
Public Shared Function FitCircle ( 
	points As DPNT_T_ARRAY,
	fit_mode As FitMode,
	param As Double
) As CFviCircle

Parameters

points
Type: FVIL..::..DPNT_T_ARRAY
入力点群 (3個以上)
fit_mode
Type: FVIL.CG..::..FitMode
近似モード
param
Type: System..::..Double
最適化パラメータ(ロバスト推定法で利用)

Return Value

Type: CFviCircle
算出された円を返します。

Remarks

与えれた座標点群から、最小二乗法または、ロバスト推定法で円の中心座標と半径を算出します。


最適化パラメータ:

ロバスト推定法は、標準偏差によりインライアとアウトライアを判定しています。 点群の誤差は正規分布であることを前提として、標準偏差より信頼区間内の点をインライアと判定します。 param は、例外値の影響を軽減するために利用されるパラメータです。 近似モード(fit_mode)によって、パラメータの意味が異なります。
誤差の計算式は、以下の通りです。

なお、 cx は中心x座標、 cy は中心y座標、 r は半径を示します。


近似モード(fit_mode):
項目説明
ロバスト推定 (M推定法)MESTIMATORparam は 誤差の標準偏差です。 標準偏差より 95% 信頼区間内の点をインライアと判定します。 つまり、 [-1.96σ, 1.96σ] より、95%信頼区間が計算されます。 推定した、対象点群の標準偏差をパラメータとして入力してください。 例えば、以下の信頼区間内の点をインライアとして判定したい場合は、次の係数を入力してください。
  • 90.0%信頼区間内:1.645
  • 95.0%信頼区間内:1.960
  • 99.0%信頼区間内:2.567
  • 99.9%信頼区間内:3.291
ロバスト推定 (ランザック法)RANSAC 同上
ロバスト推定 (最小メディアン法)LMEDSparam は無視されます。
ロバスト推定 (M推定法)
標準偏差の自動決定
MESTIMATOR2param は 誤差の標準偏差の係数です。 標準偏差は、自動的に計算されます。
ロバスト推定 (最小メディアン法)
標準偏差の自動決定
LMEDS2 同上
最小二乗法LSMparam は無視されます。
最小二乗法 (旧ライブラリ互換)LSM_FASTparam は無視されます。

入力点群の個数制限:

入力点群の個数は、近似モード毎に制限があります。 この制限は、内部計算で行列演算を用いていることに起因します。

項目説明
ロバスト推定 (M推定法)MESTIMATOR pnt_num * pnt_num < 228
ロバスト推定 (M推定法)
標準偏差の自動決定
MESTIMATOR2 pnt_num * pnt_num < 228
最小二乗法LSM pnt_num * 3 < 228

乱数:

fit_mode で、 RANSAC または LMEDS を選択した場合、 fnFIE_mtrand_real2 で発生させた擬似乱数を使用して処理をしています。 擬似乱数の初期化用シードは、現在時刻を取得して、その値にて設定をしています。 そのため、入力データが同じ点群でも、結果が異なることがあります。

処理に失敗した場合は例外を発行します。 例外の原因と発生位置を特定するには、発行された例外クラスの ErrorCode メンバと Function メンバを参照してください。


エラーコード:
ErrorCode メンバ内容
11FVIL.ErrorCode.INVALID_PARAMETER引数に指定された値が不正です。

関連する FIE 関数:

fnFIE_fit_circle

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 FitCircle()
        {
            try
            {
                double center_x = 100.0;
                double center_y =100.0;
                double radius = 100.0;

                // 0) 入力点群の準備.
                fvalgcli.DPNT_T[] data = new fvalgcli.DPNT_T[4];
                data[0].x = center_x;            data[0].y = center_y - radius;
                data[1].x = center_x - radius;    data[1].y = center_y;
                data[2].x = center_x;            data[2].y = center_y + radius;
                data[3].x = center_x + radius;  data[3].y = center_y;

                FVIL.DPNT_T_ARRAY points = new FVIL.DPNT_T_ARRAY(data);

                // 1) 処理実行.
                FVIL.Data.CFviCircle cirle = FVIL.CG.Function.FitCircle(points, FVIL.CG.FitMode.MESTIMATOR, 1.645);

                // E) 確認.
                Console.Out.WriteLine("-- Circle");
                Console.Out.WriteLine(" Source... Center = ({0:f},{1:f}), Radius = {2:f}",
                    center_x, center_y, radius);
                Console.Out.WriteLine(" Result... Center = ({0:f},{1:f}), Radius = {2:f}",
                    cirle.Center.X, cirle.Center.Y, cirle.Radius);
            }
            catch (FVIL.CFviException ex)
            {
                Assert.Fail("{0}: ErrorCode={1} {2}", ex.Function, ex.ErrorCode, ex.Message);
            }
        }
    }
}


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

Namespace SampleCode
    Public Partial Class CG
        ''' <summary>
        ''' 点群からの円近似.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub FitCircle()
            Try
                Dim center_x As Double = 100.0
                Dim center_y As Double = 100.0
                Dim radius As Double = 100.0

                ' 0) 入力点群の準備.
                Dim data As fvalgcli.DPNT_T() = New fvalgcli.DPNT_T(3) {}
                data(0).x = center_x
                data(0).y = center_y - radius
                data(1).x = center_x - radius
                data(1).y = center_y
                data(2).x = center_x
                data(2).y = center_y + radius
                data(3).x = center_x + radius
                data(3).y = center_y

                Dim points As New FVIL.DPNT_T_ARRAY(data)

                ' 1) 処理実行.
                Dim cirle As FVIL.Data.CFviCircle = FVIL.CG.[Function].FitCircle(points, FVIL.CG.FitMode.MESTIMATOR, 1.645)

                ' E) 確認.
                Console.Out.WriteLine("-- Circle")
                Console.Out.WriteLine(" Source... Center = ({0:f},{1:f}), Radius = {2:f}", center_x, center_y, radius)
                Console.Out.WriteLine(" Result... Center = ({0:f},{1:f}), Radius = {2:f}", cirle.Center.X, cirle.Center.Y, cirle.Radius)
            Catch ex As FVIL.CFviException
                Assert.Fail("{0}: ErrorCode={1} {2}", ex.[Function], ex.ErrorCode, ex.Message)
            End Try
        End Sub
    End Class
End Namespace

Exceptions

ExceptionCondition
FVIL..::..CFviExceptionこの例外の原因については、上記のエラーコード表をご参照ください。

See Also