点群からの直線近似
Namespace: fvalgcliAssembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)
Syntax
C# |
---|
public static int fnFIE_fit_line( DPNT_T_PTR pnts, int pnt_num, f_fit_mode fitting_mode, double param, ref DLINE_T line ) |
Visual Basic |
---|
Public Shared Function fnFIE_fit_line ( pnts As DPNT_T_PTR, pnt_num As Integer, fitting_mode As f_fit_mode, param As Double, ByRef line As DLINE_T ) As Integer |
Parameters
- pnts
- Type: fvalgcli..::..DPNT_T_PTR
入力点群
- pnt_num
- Type: System..::..Int32
入力点群の個数( pnt_num ≧ 2 )
- fitting_mode
- Type: fvalgcli..::..f_fit_mode
近似モード- F_FIT_LSM :最小二乗法
- F_FIT_LSM_FAST :最小二乗法(旧ライブラリ仕様)
- F_FIT_MESTIMATOR :ロバスト推定法(M推定法)
- F_FIT_RANSAC :ロバスト推定法(ランザック法)
- F_FIT_LMEDS :ロバスト推定法(最小メディアン法)
- F_FIT_MESTIMATOR2 :ロバスト推定法(M推定法)...標準偏差を自動決定
- F_FIT_LMEDS2 :ロバスト推定法(最小メディアン法)...標準偏差を自動決定
- param
- Type: System..::..Double
最適化パラメータ(ロバスト推定法で利用)
- line
- Type: fvalgcli..::..DLINE_T%
直線の係数
Return Value
Type: Int32以下のエラーコードを返します。
エラーコード:
f_err | 内容 |
---|---|
F_ERR_NONE | 正常終了 |
F_ERR_NOMEMORY | メモリ不足エラー |
F_ERR_CALC_IMPOSSIBLE | 計算不可 |
F_ERR_INVALID_PARAM | パラメータ異常 |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Examples
C# | Copy |
---|---|
// $Revision: 1.1 $ using System; using System.Collections.Generic; using System.Text; using fvalgcli; namespace TC { public partial class FIE { [FvPluginExecute] public void fnFIE_fit_line() { int status = (int)f_err.F_ERR_NONE; // 定数. const int WIDTH = 256; // 出力画像の幅. const int HEIGHT = 256; // 出力画像の高さ. const int PNTS_NUM = 64; // 入力点数. // ルート画像. FHANDLE hdst = FHANDLE.Zero; // 結果画像. DOUBLE_PTR val = DOUBLE_PTR.Zero; // 画像に描画する際の濃度値. F_RANDDESC r = new F_RANDDESC(); // 擬似乱数列生成用データ. uint seed = 152; // 乱数因子(適当な値). double random; // 乱数. // 直線生成パラメータ. DLINE_T line = new DLINE_T(); // 点列の作成. DPNT_T_PTR pnts = DPNT_T_PTR.Zero; try { // 点列描画用変数初期化. val = DOUBLE_PTR.alloc(3); // 乱数生成子の初期化. api.fnFIE_mtrand_init(seed, ref r); // 点列領域確保. pnts = DPNT_T_PTR.alloc(PNTS_NUM); // 出力画像の領域を確保します. hdst = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_UC8, 3, WIDTH, HEIGHT); // 出力画像を白色(255)で塗りつぶす. api.fnFIE_img_clear(hdst, 255); // 濃度値の設定. val[0] = 0; //R. val[1] = 0; //G. val[2] = 0; //B. // 入力点列の生成. for (int i = 0; i < PNTS_NUM; i++) { // 座標の設定. pnts[i] = DPNT_T.init(i * (WIDTH / PNTS_NUM), 0); // 乱数の生成. random = api.fnFIE_mtrand_real2(ref r); // 乱数を付加. pnts[i] = DPNT_T.init(pnts[i].x, ((2 * pnts[i].x) - 10) + 100 * (random - 0.5)); // 点列を描画する(点描画では小さいので,円で描画). api.fnFIE_draw_circle(hdst, val, f_draw_fill_mode.F_DRAW_FILL_IN, pnts[i], 1); } //最小二乗法による直線の推定. status = api.fnFIE_fit_line(pnts, PNTS_NUM, f_fit_mode.F_FIT_LSM, 0, ref line); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status); // 濃度値の設定. val[0] = 255; //R. api.fnFIE_draw_line(hdst, val, line); // 画像をPNG形式で保存する. api.fnFIE_save_png(ResultDir + "/fnFIE_fit_line.png", hdst, -1); // 結果を出力する. ConsoleOut.WriteFunctionName(":\t"); Console.Write(" ..."); ConsoleOut.IsTrue(hdst != FHANDLE.Zero); } finally { // 解放 val.Dispose(); hdst.Dispose(); pnts.Dispose(); } } } } |
Visual Basic | Copy |
---|---|
' $Revision: 1.1 $ Imports System.Collections.Generic Imports System.Text Imports fvalgcli Public Partial Class FIE <FvPluginExecute> _ Public Sub fnFIE_fit_line() Dim status As Integer = CInt(f_err.F_ERR_NONE) ' 定数. Const WIDTH As Integer = 256 ' 出力画像の幅. Const HEIGHT As Integer = 256 ' 出力画像の高さ. Const PNTS_NUM As Integer = 64 ' 入力点数. ' ルート画像. Dim hdst As FHANDLE = FHANDLE.Zero ' 結果画像. Dim val As DOUBLE_PTR = DOUBLE_PTR.Zero ' 画像に描画する際の濃度値. Dim r As New F_RANDDESC() ' 擬似乱数列生成用データ. Dim seed As UInteger = 152 ' 乱数因子(適当な値). Dim random As Double ' 乱数. ' 直線生成パラメータ. Dim line As New DLINE_T() ' 点列の作成. Dim pnts As DPNT_T_PTR = DPNT_T_PTR.Zero Try ' 点列描画用変数初期化. val = DOUBLE_PTR.alloc(3) ' 乱数生成子の初期化. api.fnFIE_mtrand_init(seed, r) ' 点列領域確保. pnts = DPNT_T_PTR.alloc(PNTS_NUM) ' 出力画像の領域を確保します. hdst = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_UC8), 3, WIDTH, HEIGHT) ' 出力画像を白色(255)で塗りつぶす. api.fnFIE_img_clear(hdst, 255) ' 濃度値の設定. val(0) = 0 'R. val(1) = 0 'G. val(2) = 0 'B. ' 入力点列の生成. For i As Integer = 0 To PNTS_NUM - 1 ' 座標の設定. pnts(i) = DPNT_T.init(i * (WIDTH \ PNTS_NUM), 0) ' 乱数の生成. random = api.fnFIE_mtrand_real2(r) ' 乱数を付加. pnts(i) = DPNT_T.init(pnts(i).x, ((2 * pnts(i).x) - 10) + 100 * (random - 0.5)) ' 点列を描画する(点描画では小さいので,円で描画). api.fnFIE_draw_circle(hdst, val, f_draw_fill_mode.F_DRAW_FILL_IN, pnts(i), 1) Next '最小二乗法による直線の推定. status = api.fnFIE_fit_line(pnts, PNTS_NUM, f_fit_mode.F_FIT_LSM, 0, line) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err)) ' 濃度値の設定. val(0) = 255 'R. api.fnFIE_draw_line(hdst, val, line) ' 画像をPNG形式で保存する. api.fnFIE_save_png(ResultDir & "/fnFIE_fit_line.png", hdst, -1) ' 結果を出力する. ConsoleOut.WriteFunctionName(":" & vbTab) Console.Write(" ...") ConsoleOut.IsTrue(hdst <> FHANDLE.Zero) Finally ' 解放 val.Dispose() hdst.Dispose() pnts.Dispose() End Try End Sub End Class |