DP法による点列の折れ線化
Namespace: FVIL.CGAssembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)
Syntax
C# |
---|
[SerializableAttribute] public class CFviVectorize2dDP : CFviObject, IFviCopyable, ICloneable |
Visual Basic |
---|
<SerializableAttribute> Public Class CFviVectorize2dDP Inherits CFviObject Implements IFviCopyable, ICloneable |
Remarks
点列をDP法( Ramer / Douglas Peucker algorithm )を用いて間引き、折れ線にして出力します。 始点と終点が異なる点列を与えた場合は、始点と終点を必ず出力します。 始点と終点に同じ座標の入った点列を与えた場合、 閉曲線と判断して入力点列の始点から最も遠い点を探し、 その点から最も遠い点を探して新しい始点としてから折れ線化するため 必ずしも入力点列の始点と終点を出力するとは限りませんが、 出力点列の始点と終点には同一の座標が入ります。
入力データ:
このクラスでは、入力データは Execute(PNT_T_ARRAY, Double) メソッドの引数に指定します。
引数 | 範囲 | 説明 |
---|---|---|
src | 3点以上 | 入力座標点列 |
threshold | 0 より大きい値 |
折れ線閾値 折れ線と点列を比較したとき点列が折れ線の方向から垂直に何ピクセル外れていたら折るかを指定します。 出力する点列は元の点列から threshold より大きく外れません。 |
出力データ:
アルゴリズム:
- 点列を用意します。
- 始点と終点を結ぶ線分を引き、最も遠い点から垂線をおろして長さを測ります。
- 垂線の長さが threshold より長かったらその点で線分を折り、残りの点のうち新たな線分から最も遠い点から垂線をおろして長さを測ります。
- 垂線の長さが threshold より短くなったら終了します。
関連する FIE 関数:
fnFIE_cg_vectorize2d_dp
Examples
ソースコード:
C# | Copy |
---|---|
using System; using System.Collections.Generic; using System.Text; using fvalgcli; namespace User.SampleCode { public partial class CG { /// <summary> /// DP法による点列の折れ線化. /// </summary> [FvPluginExecute] public void Vectorize2dDP() { // 0) 点群の準備. FVIL.Data.CFviImage src1 = new FVIL.Data.CFviImage(); FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/CG_Vectorize2d_src.bmp", src1, FVIL.PixelMode.Unpacking); FVIL.Edge.CFviEdgeResultI32 result1 = new FVIL.Edge.CFviEdgeResultI32(); FVIL.Edge.CFviEdge2DSobelParam param = new FVIL.Edge.CFviEdge2DSobelParam(); param.EdgeThreshold = 120; param.NmsLength = 1; GetEdgePoints(src1, param, result1); FVIL.PNT_T_ARRAY points = result1.ToPNT_T_ARRAY(); // 1) インスタンスの準備. FVIL.CG.CFviVectorize2dDP parser = new FVIL.CG.CFviVectorize2dDP(); // 2) 処理実行. parser.Execute(points, 3.0); // E) 確認. string outputFile = Defs.ResultDir + "/CG.Vectorize2dDP.png"; Console.Out.WriteLine("-- Vectorize2dDP:{0}", outputFile); FVIL.GDI.CFviGdiPoints gdipoints = new FVIL.GDI.CFviGdiPoints(parser.Points); { FVIL.Data.CFviImage image = new FVIL.Data.CFviImage(); // 画像表示の準備. FVIL.GDI.CFviDisplay display = new FVIL.GDI.CFviDisplay(); display.Image = image; display.DisplayRect = image.Window; // オーバレイの生成. FVIL.GDI.CFviOverlay pOverlay0 = new FVIL.GDI.CFviOverlay(); pOverlay0.Scaling = true; pOverlay0.Enable = true; display.Overlays.Add(pOverlay0); // GDI オブジェクトの追加. pOverlay0.Figures.Add(gdipoints); // 保存. FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage(); display.SaveImage(canvas, display.DisplayRect, 1.0); FVIL.File.Function.SaveImageFile(outputFile, canvas); } } } } |
Visual Basic | Copy |
---|---|
Imports System.Collections.Generic Imports System.Text Imports fvalgcli Namespace SampleCode Public Partial Class CG ''' <summary> ''' DP法による点列の折れ線化. ''' </summary> <FvPluginExecute> _ Public Sub Vectorize2dDP() ' 0) 点群の準備. Dim src1 As New FVIL.Data.CFviImage() FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/CG_Vectorize2d_src.bmp", src1, FVIL.PixelMode.Unpacking) Dim result1 As New FVIL.Edge.CFviEdgeResultI32() Dim param As New FVIL.Edge.CFviEdge2DSobelParam() param.EdgeThreshold = 120 param.NmsLength = 1 GetEdgePoints(src1, param, result1) Dim points As FVIL.PNT_T_ARRAY = result1.ToPNT_T_ARRAY() ' 1) インスタンスの準備. Dim parser As New FVIL.CG.CFviVectorize2dDP() ' 2) 処理実行. parser.Execute(points, 3.0) ' E) 確認. Dim outputFile As String = Defs.ResultDir & "/CG.Vectorize2dDP.png" Console.Out.WriteLine("-- Vectorize2dDP:{0}", outputFile) Dim gdipoints As New FVIL.GDI.CFviGdiPoints(parser.Points) If True Then Dim image As New FVIL.Data.CFviImage() ' 画像表示の準備. Dim display As New FVIL.GDI.CFviDisplay() display.Image = image display.DisplayRect = image.Window ' オーバレイの生成. Dim pOverlay0 As New FVIL.GDI.CFviOverlay() pOverlay0.Scaling = True pOverlay0.Enable = True display.Overlays.Add(pOverlay0) ' GDI オブジェクトの追加. pOverlay0.Figures.Add(gdipoints) ' 保存. Dim canvas As New FVIL.Data.CFviImage() display.SaveImage(canvas, display.DisplayRect, 1.0) FVIL.File.[Function].SaveImageFile(outputFile, canvas) End If 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 |