点群からの円近似
Namespace: FVIL.CGAssembly: 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推定法) | MESTIMATOR | param は 誤差の標準偏差です。
標準偏差より 95% 信頼区間内の点をインライアと判定します。
つまり、 [-1.96σ, 1.96σ] より、95%信頼区間が計算されます。
推定した、対象点群の標準偏差をパラメータとして入力してください。
例えば、以下の信頼区間内の点をインライアとして判定したい場合は、次の係数を入力してください。
|
ロバスト推定 (ランザック法) | RANSAC | 同上 |
ロバスト推定 (最小メディアン法) | LMEDS | param は無視されます。 |
ロバスト推定 (M推定法) 標準偏差の自動決定 | MESTIMATOR2 | param は 誤差の標準偏差の係数です。 標準偏差は、自動的に計算されます。 |
ロバスト推定 (最小メディアン法) 標準偏差の自動決定 | LMEDS2 | 同上 |
最小二乗法 | LSM | param は無視されます。 |
最小二乗法 (旧ライブラリ互換) | LSM_FAST | param は無視されます。 |
入力点群の個数制限:
入力点群の個数は、近似モード毎に制限があります。 この制限は、内部計算で行列演算を用いていることに起因します。
項目 | 値 | 説明 |
---|---|---|
ロバスト推定 (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 メンバ | 内容 |
---|---|---|
11 | FVIL.ErrorCode.INVALID_PARAMETER | 引数に指定された値が不正です。 |
関連する FIE 関数:
fnFIE_fit_circle
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 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 |
---|---|
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
Exception | Condition |
---|---|
FVIL..::..CFviException | この例外の原因については、上記のエラーコード表をご参照ください。 |