エッジ検出結果 (整数版)

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

Syntax

C#
[SerializableAttribute]
public class CFviEdgeResultI32 : CFviDataObject, 
	ISerializable, IXmlSerializable, IEnumerable<F_EDGE>
Visual Basic
<SerializableAttribute>
Public Class CFviEdgeResultI32
	Inherits CFviDataObject
	Implements ISerializable, IXmlSerializable, IEnumerable(Of F_EDGE)

Remarks

エッジ検出(CFviEdge2D 等)の結果を格納するクラスです。

このクラスは、アンマネージ環境のヒープに F_EDGE 構造体の配列を確保します。
確保した領域のアドレスは、Address に保管され、 Clear()()()() が呼ばれた時や このインスタンスが解放される時に自動的に解放されます。

このクラスは、.NET 環境とネイティブ環境の間で大量の画像処理データの受け渡しを行うことを目的としています。
通常、.NET 環境の固定長配列をネイティブ環境に受け渡す場合は マーシャリングが必要になり、 データのコピーが少なくとも1回は発生します。 ネイティブ環境の処理結果を .NET 環境に反映する場合(In,Out 属性の引数の場合)は、計2回発生します。 このクラスを使用するとマーシャリングの必要が無い為、データコピーのコスト削減が行えます。


領域の確保と解放について:

領域の確保と解放は FIE ライブラリを使用しています。 外部で確保した領域を設定することもできますが、 アロケータを一致させる必要がありますのでご注意ください。(下表参照) 自動的に解放したくない場合は、 IsAttachtrue に設定することで回避できます。


その他の操作:
操作メソッド概要
領域設定SetBuffer(F_EDGE_PTR, Int32, Boolean)外部で確保した領域を設定する場合に使用します。
アタッチAttach(Object)同一型のインスタンスが保有する領域にアタッチします。
移動MoveFrom(Object)同一型のインスタンスが保有する領域をこのインスタンスに移動します。
複製CopyFrom(Object)同一型のインスタンスの内容を複製します。

初期値と範囲:
プロパティ初期値範囲説明
Item[([( Int32])]) (なし)F_EDGE配列の要素の取得または設定を行います。
AddressIntPtr.ZeroIntPtr.Zero または 有効なアドレス配列の先頭アドレスの取得を行います。
Count00,1~配列の要素数の取得を行います。
IsAttachfalsefalse/trueアタッチ状態の取得または設定を行います。
SizeOfItemsizeof(F_EDGE)sizeof(F_EDGE)配列要素1つ分のサイズ(byte)を取得します。
Size0SizeOfItem × Count配列全体のサイズ(byte)を取得します。

要素の型変換:
項目自身 ← 複製元(左記)複製先(左記) ← 自身
F_EDGE そのまま複製します。 そのまま複製します。
F_DEDGE XY座標は、四捨五入して複製します。
エッジ強度は -1.0~1.0 から -16384~16384 にレンジ変換します。
角度は Radian から Degree に変換します。
XY座標は、そのまま複製します。
エッジ強度は -16384~16384 から -1.0~1.0 にレンジ変換します。
角度は Degree から Radian に変換します。
CFviEdgeData XY座標は、四捨五入して複製します。
エッジ強度は -1.0~1.0 から -16384~16384 にレンジ変換します。
角度は Degree として複製します。
XY座標は、そのまま複製します。
エッジ強度は -16384~16384 から -1.0~1.0 にレンジ変換します。
角度は Degree から CFviAngle に変換します。
CFviPoint XY座標は、四捨五入して複製します。
エッジ強度と角度は 0 初期化します。
XY座標は、そのまま複製します。
エッジ強度と角度は無視します。
PointF XY座標は、四捨五入して複製します。
エッジ強度と角度は 0 初期化します。
XY座標は、そのまま複製します。
エッジ強度と角度は無視します。
Point XY座標は、そのまま複製します。
エッジ強度と角度は 0 初期化します。
XY座標は、そのまま複製します。
エッジ強度と角度は無視します。
DEDGE_T XY座標は、四捨五入して複製します。
角度は Radian から Degree に変換します。
エッジ強度は 0 初期化します。
XY座標は、そのまま複製します。
角度は Degree から Radian に変換します。
エッジ強度は無視します。
DPNT_T XY座標は、四捨五入して複製します。
エッジ強度と角度は 0 初期化します。
XY座標は、そのまま複製します。
エッジ強度と角度は無視します。
PNT_T XY座標は、そのまま複製します。
エッジ強度と角度は 0 初期化します。
XY座標は、そのまま複製します。
エッジ強度と角度は無視します。

データ変換 (1):

エッジ点群(または点群)を保有する他の機能からデータ変換するには、 CopyFrom(Object) メソッドを使用してください。
各要素の型変換は、前述の "要素の型変換" に従属します。
対応しているクラスは以下の通りです。

項目説明
CFviEdgeResultI32 エッジ検出結果クラス(整数版)が保有するエッジデータを複製します。
全ての要素をそのまま複製します。
CFviEdgeResultD64 エッジ検出結果クラス(実数版)が保有するエッジデータを複製します。
要素の型変換は F_DEDGE からの変換に従属します。
F_DEDGE の IEnumerable F_DEDGE 構造体の IEnumerable が保有するエッジデータを複製します。
要素の型変換は F_DEDGE からの変換に従属します。
F_EDGE の IEnumerable F_EDGE 構造体の IEnumerable が保有するエッジデータを複製します。
要素の型変換は F_EDGE からの変換に従属します。
DEDGE_T_ARRAY DEDGE_T 構造体の配列クラス (または IEnumerable) が保有するエッジデータを複製します。
要素の型変換は DEDGE_T からの変換に従属します。
DPNT_T_ARRAY DPNT_T 構造体の配列クラス (または IEnumerable) が保有する点列データを複製します。
要素の型変換は DPNT_T からの変換に従属します。
PNT_T_ARRAY PNT_T 構造体の配列クラス (または IEnumerable) が保有する点列データを複製します。
要素の型変換は PNT_T からの変換に従属します。
CFviEdgeResult 従来のエッジ検出結果クラスが保有するエッジデータを複製します。
要素の型変換は CFviEdgeData からの変換に従属します。
CFviFPM2Feature FPM2 の特徴量クラスが保有する 特徴量(GetFeatureEdges()()()()を複製します。
これは、 Create(CFviImage, MatchMode, CFviDataObject, Boolean) が実行されたあと有効になります。
要素の型変換は CFviEdgeData からの変換に従属します。
CFviFPM2Template FPM2 のテンプレート特徴量クラスが保有する 特徴量(GetFeatureEdges()()()()を複製します。
これは、 Create(CFviImage, MatchMode, CFviDataObject, CFviPoint, CFviImage) または Create(CFviPattern, MatchMode, CFviDataObject) が実行されたあと有効になります。
要素の型変換は CFviEdgeData からの変換に従属します。
CFviLineHoughCorrelationEdge 直線ハフ検出クラスが保有するエッジデータを複製します。
これは、画像処理実行後に有効になるもので、 GetEdges()()()() から取得できるエッジデータではありません。
要素の型変換は CFviEdgeData からの変換に従属します。
CFviLineHoughSobelEdge 直線ハフ検出クラスが保有するエッジデータを複製します。
これは、画像処理実行後に有効になるもので、 GetEdges()()()() から取得できるエッジデータではありません。
要素の型変換は CFviEdgeData からの変換に従属します。
CFviCircleHoughCorrelationEdge 円ハフ検出クラスが保有するエッジデータを複製します。
これは、画像処理実行後に有効になるもので、 GetEdges()()()() から取得できるエッジデータではありません。
要素の型変換は CFviEdgeData からの変換に従属します。
CFviCircleHoughSobelEdge 円ハフ検出クラスが保有するエッジデータを複製します。
これは、画像処理実行後に有効になるもので、 GetEdges()()()() から取得できるエッジデータではありません。
要素の型変換は CFviEdgeData からの変換に従属します。

データ変換 (2): 他の機能へのデータ変換

本クラスから他の機能へデータ変換するには、下記のメソッドを使用してください。

項目メソッド説明
F_EDGE コレクションToList()()()() 全要素を F_EDGE 構造体のコレクションに格納して返します。
F_EDGE 配列ToArray()()()() 全要素を F_EDGE 構造体の固定長配列に格納して返します。
DPNT_T_ARRAYToDPNT_T_ARRAY()()()() 全要素を DPNT_T 構造体のコレクションに格納して返します。
要素の型変換は、前述の "要素の型変換" に従属します。
PNT_T_ARRAYToPNT_T_ARRAY()()()() 全要素を PNT_T 構造体のコレクションに格納して返します。
要素の型変換は、前述の "要素の型変換" に従属します。
DEDGE_T_ARRAYToDEDGE_T_ARRAY()()()() 全要素を DEDGE_T 構造体のコレクションに格納して返します。
要素の型変換は、前述の "要素の型変換" に従属します。
CFviPoint コレクションToCFviPoint()()()() 全要素のエッジ座標をコレクションに格納して返します。
要素の型変換は、前述の "要素の型変換" に従属します。
CFviEdgeData コレクションToCFviEdgeData()()()() 全要素を CFviEdgeData のコレクションに格納して返します。
要素の型変換は、前述の "要素の型変換" に従属します。

Examples

ソースコード:
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;    // FvPluginXXXX attribute requires fvalgcli

namespace User.SampleCode
{
    public partial class Edge
    {
        // ============================================================
        /// <summary>
        /// CFviEdge2D クラス + CFviEdgeResultI32 クラス.
        /// </summary>
        /// <remarks>
        /// 相関エッジ法.
        /// </remarks>
        [FvPluginExecute]
        public void Edge2D_EdgeResultI32_CorrelationParam()
        {
            FVIL.Edge.CFviEdge2DCorrelationParam param = new FVIL.Edge.CFviEdge2DCorrelationParam();

            param.RegionWidth = 13;
            param.RegionHeight = 5;
            param.SigmoidK = 1.0;
            param.VarThreshold = 20.0;
            param.EdgeThreshold = 40;
            param.NmsLength = 6;

            Edge2D_EdgeResultI32(Defs.ResultDir + "/Edge.Edge2DCorrelation_EdgeResultI32-mag.png", param);
        }

        // ============================================================
        /// <summary>
        /// CFviEdge2D クラス + CFviEdgeResultI32 クラス.
        /// </summary>
        /// <remarks>
        /// ソーベル法.
        /// </remarks>
        [FvPluginExecute]
        public void Edge2D_EdgeResultI32_SobelParam()
        {
            FVIL.Edge.CFviEdge2DSobelParam param = new FVIL.Edge.CFviEdge2DSobelParam();

            param.EdgeThreshold = 120;
            param.NmsLength = 1;

            Edge2D_EdgeResultI32(Defs.ResultDir + "/Edge.Edge2DSobel_EdgeResultI32-mag.png", param);
        }

        // ============================================================
        /// <summary>
        /// CFviEdge2D クラス + CFviEdgeResultI32 クラス.
        /// </summary>
        public void Edge2D_EdgeResultI32(string filename, FVIL.Data.CFviDataObject param)
        {
            // 1) インスタンスの準備.
            FVIL.Edge.CFviEdge2D parser = new FVIL.Edge.CFviEdge2D();
            FVIL.Edge.CFviEdgeResultI32 result = new FVIL.Edge.CFviEdgeResultI32();
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage();
            FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage();

            // 2) 処理対象画像の取り込み.
            FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/floppy_hough.jpg", src, FVIL.PixelMode.Unpacking);

            // 3) 処理対象画像の有効性検査.
            int valid = FVIL.Edge.CFviEdge2D.CheckValidity(src);
            if (valid != FVIL.ErrorCode._SUCCESS)
                throw new FVIL.CFviException(valid, "FVIL.Edge.CFviEdge2D.CheckValidity");

            // 4) 画像処理準備 (共通)
            parser.SrcImages[0] = src;
            parser.DstImages[0] = dst;
            if (!parser.IsValid())    // 有効性検査.
                parser.Validate();    // 有効化.
            parser.Result = result;

            // 5-1) パラメータ設定 (継承)
            parser.BorderMode = FVIL.BorderMode.None;
            parser.MagMode = FVIL.Edge.MagMode.XY;
            parser.SaveMode = FVIL.Edge.SaveMode.Mag | FVIL.Edge.SaveMode.Direct;

            // 5-2) パラメータ設定 (固有)
            parser.Param = param;

            // 6) 画像処理実行.
            parser.Execute();

            // E) 処理結果画像の保存.
            FVIL.File.Function.SaveImageFile(filename, dst);

            // E) 処理結果の取得.
            {
                Console.WriteLine("    result[]");

                for (int index = 0; index < result.Count; index++)
                {
                    fvalgcli.F_EDGE data = result[index];
                    int x = data.x;
                    int y = data.y;
                    int q = data.q;
                    int mag = data.mag;
                }
            }
        }    
    }
}


Visual Basic Copy imageCopy
Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli
' FvPluginXXXX attribute requires fvalgcli
Namespace SampleCode
    Public Partial Class Edge
        ' ============================================================
        ''' <summary>
        ''' CFviEdge2D クラス + CFviEdgeResultI32 クラス.
        ''' </summary>
        ''' <remarks>
        ''' 相関エッジ法.
        ''' </remarks>
        <FvPluginExecute> _
        Public Sub Edge2D_EdgeResultI32_CorrelationParam()
            Dim param As New FVIL.Edge.CFviEdge2DCorrelationParam()

            param.RegionWidth = 13
            param.RegionHeight = 5
            param.SigmoidK = 1.0
            param.VarThreshold = 20.0
            param.EdgeThreshold = 40
            param.NmsLength = 6

            Edge2D_EdgeResultI32(Defs.ResultDir & "/Edge.Edge2DCorrelation_EdgeResultI32-mag.png", param)
        End Sub

        ' ============================================================
        ''' <summary>
        ''' CFviEdge2D クラス + CFviEdgeResultI32 クラス.
        ''' </summary>
        ''' <remarks>
        ''' ソーベル法.
        ''' </remarks>
        <FvPluginExecute> _
        Public Sub Edge2D_EdgeResultI32_SobelParam()
            Dim param As New FVIL.Edge.CFviEdge2DSobelParam()

            param.EdgeThreshold = 120
            param.NmsLength = 1

            Edge2D_EdgeResultI32(Defs.ResultDir & "/Edge.Edge2DSobel_EdgeResultI32-mag.png", param)
        End Sub

        ' ============================================================
        ''' <summary>
        ''' CFviEdge2D クラス + CFviEdgeResultI32 クラス.
        ''' </summary>
        Public Sub Edge2D_EdgeResultI32(filename As String, param As FVIL.Data.CFviDataObject)
            ' 1) インスタンスの準備.
            Dim parser As New FVIL.Edge.CFviEdge2D()
            Dim result As New FVIL.Edge.CFviEdgeResultI32()
            Dim src As New FVIL.Data.CFviImage()
            Dim dst As New FVIL.Data.CFviImage()

            ' 2) 処理対象画像の取り込み.
            FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/floppy_hough.jpg", src, FVIL.PixelMode.Unpacking)

            ' 3) 処理対象画像の有効性検査.
            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

            ' 4) 画像処理準備 (共通)
            parser.SrcImages(0) = src
            parser.DstImages(0) = dst
            If Not parser.IsValid() Then
                ' 有効性検査.
                parser.Validate()
            End If
            ' 有効化.
            parser.Result = result

            ' 5-1) パラメータ設定 (継承)
            parser.BorderMode = FVIL.BorderMode.None
            parser.MagMode = FVIL.Edge.MagMode.XY
            parser.SaveMode = FVIL.Edge.SaveMode.Mag Or FVIL.Edge.SaveMode.Direct

            ' 5-2) パラメータ設定 (固有)
            parser.Param = param

            ' 6) 画像処理実行.
            parser.Execute()

            ' E) 処理結果画像の保存.
            FVIL.File.[Function].SaveImageFile(filename, dst)

            ' E) 処理結果の取得.
            If True Then
                Console.WriteLine(vbTab & "result[]")

                For index As Integer = 0 To result.Count - 1
                    Dim data As fvalgcli.F_EDGE = result(index)
                    Dim x As Integer = data.x
                    Dim y As Integer = data.y
                    Dim q As Integer = data.q
                    Dim mag As Integer = data.mag
                Next
            End If
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL.Data..::..CFviDataObject
FVIL.Edge..::..CFviEdgeResultI32

See Also