直線に近いエッジ点列の取得 (整数版)

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

Syntax

C#
public static CFviEdgeResultI32 GetSupportEdges(
	F_LH_LINE line,
	CFviEdgeResultI32 edges,
	int err_r,
	int err_q,
	ref SortType sort_type
)
Visual Basic
Public Shared Function GetSupportEdges ( 
	line As F_LH_LINE,
	edges As CFviEdgeResultI32,
	err_r As Integer,
	err_q As Integer,
	ByRef sort_type As SortType
) As CFviEdgeResultI32

Parameters

line
Type: fvalgcli..::..F_LH_LINE
直線ハフ検出データ
edges
Type: FVIL.Edge..::..CFviEdgeResultI32
エッジ点列 (1点以上)
err_r
Type: System..::..Int32
ρ方向許容誤差 (0~)
err_q
Type: System..::..Int32
θ方向許容誤差 (0~)
sort_type
Type: FVIL.Hough..::..SortType%
ソート方法

Return Value

Type: CFviEdgeResultI32
直線に近いエッジ点列を取得して返します。

Remarks

回答の点群はx座標またはy座標に関してソートされます。 ソートの方法は、引数 sort_type に指定されたオブジェクトに格納されます。 ユーザ側から、ソート方法を指定することは出来ません。

line には、 LineHough(CFviEdgeResultI32, CFviLineHoughParam) で得られた結果(複数の直線)の内の1つを指定してください。

edges には、直線の近くにある可能性のあるエッジ点列を指定します。 LineHough(CFviEdgeResultI32, CFviLineHoughParam) で指定したエッジ点列をそのまま入力して構いません。 若しくは、何らかの方法によって候補を絞ったものを入力しても結構です。 このエッジ点列の中から直線上にある点が選ばれます。

err_r はエッジ点が直線の近くにあるかどうかを判定するための値です。 具体的には、直線とエッジ点との距離が err_r 以内の場合、 このエッジ点が直線の近くにあると判定されます。(下図参照)

err_q はエッジ点が直線の真のエッジ点であるかどうかを判定するための値です。 具体的には、直線の向きとエッジ点の向きとの差の絶対値が err_q 以内の場合、 このエッジ点が直線の真のエッジであると判定されます。(下図参照)

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


エラーコード:
ErrorCode メンバ内容
51FVIL.ErrorCode.LICENSE_ERROR ライセンスキーが見つからない為、実行できません。 または、 FVIL._SetUp.InitVisionLibrary が実行されていません。
11FVIL.ErrorCode.INVALID_PARAMETERパラメータに誤りがあります。
1FVIL.ErrorCode.FAILED_TO_ALLOCATEメモリの確保に失敗しました。
29FVIL.ErrorCode.NOT_CALCULABLE計算不可能です。

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 Hough
    {
        // ============================================================
        /// <summary>
        /// Hough.Function.GetSupportEdges メソッド.
        /// </summary>
        /// <remarks>
        /// </remarks>
        [FvPluginExecute]
        public void GetSupportEdges_I32()
        {
            try
            {
                // 1) インスタンスの準備.
                FVIL.Data.CFviImage src = new FVIL.Data.CFviImage();
                FVIL.Hough.CFviLineHoughParam param = new FVIL.Hough.CFviLineHoughParam();

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

                // 3) パラメータの設定.
                param.AngleEd = new FVIL.Data.CFviAngle(359.0);
                param.AngleSt = new FVIL.Data.CFviAngle(0.0);
                param.VoteWidth = 10;
                param.RegionQ = 10;
                param.RegionR = 10;

                // 4) 画像処理実行.    
                // --(1) エッジ点の取得.
                FVIL.Edge.CFviEdgeResultI32 result = GetEdge2D_EdgeResultI32(src);
                // --(2) 直線ハフ検出.
                FVIL.F_LH_LINE_ARRAY array = FVIL.Hough.FunctionEx.LineHough(result, param);
                if (0 == array.Count) Assert.Fail(" 直線が見つかりません.");

                // --(3) GetSupportEdges 実行.
                FVIL.Hough.SortType sort_type = FVIL.Hough.SortType.XSort;
                FVIL.Edge.CFviEdgeResultI32 supportEdge = FVIL.Hough.FunctionEx.GetSupportEdges(array[0], result, 3, 3, ref sort_type);

                // E) 確認用.
                {
                    FVIL.Data.CFviImage image = new FVIL.Data.CFviImage();
                    image.Copy(src, 1);
                    FVIL.Paint.Function.DrawPoints(image, supportEdge.ToCFviEdgeData(), 200.0);
                    FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/Hough.GetSupportEdges_I32.png", image);
                }
            }
            catch (FVIL.CFviException ex)
            {
                Assert.Fail(ex.Function + "\n : " + ex.Message + ": ErrorCode={0}", ex.ErrorCode);
            }

        }
    }
}


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 Hough
        ' ============================================================
        ''' <summary>
        ''' Hough.Function.GetSupportEdges メソッド.
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        <FvPluginExecute> _
        Public Sub GetSupportEdges_I32()
            Try
                ' 1) インスタンスの準備.
                Dim src As New FVIL.Data.CFviImage()
                Dim param As New FVIL.Hough.CFviLineHoughParam()

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

                ' 3) パラメータの設定.
                param.AngleEd = New FVIL.Data.CFviAngle(359.0)
                param.AngleSt = New FVIL.Data.CFviAngle(0.0)
                param.VoteWidth = 10
                param.RegionQ = 10
                param.RegionR = 10

                ' 4) 画像処理実行.    
                ' --(1) エッジ点の取得.
                Dim result As FVIL.Edge.CFviEdgeResultI32 = GetEdge2D_EdgeResultI32(src)
                ' --(2) 直線ハフ検出.
                Dim array As FVIL.F_LH_LINE_ARRAY = FVIL.Hough.FunctionEx.LineHough(result, param)
                If 0 = array.Count Then
                    Assert.Fail(" 直線が見つかりません.")
                End If

                ' --(3) GetSupportEdges 実行.
                Dim sort_type As FVIL.Hough.SortType = FVIL.Hough.SortType.XSort
                Dim supportEdge As FVIL.Edge.CFviEdgeResultI32 = FVIL.Hough.FunctionEx.GetSupportEdges(array(0), result, 3, 3, sort_type)

                ' E) 確認用.
                If True Then
                    Dim image As New FVIL.Data.CFviImage()
                    image.Copy(src, 1)
                    FVIL.Paint.[Function].DrawPoints(image, supportEdge.ToCFviEdgeData(), 200.0)
                    FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/Hough.GetSupportEdges_I32.png", image)
                End If
            Catch ex As FVIL.CFviException
                Assert.Fail(ex.[Function] & vbLf & " : " & ex.Message & ": ErrorCode={0}", ex.ErrorCode)
            End Try

        End Sub
    End Class
End Namespace
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 Hough
    {
        // ============================================================
        /// <summary>
        /// エッジ点の取得.
        /// </summary>
        /// <remarks>
        /// CFviEdge2D.
        /// CFviEdge2DSobelParam.
        /// CFviEdgeResultI32.
        /// </remarks>
        private FVIL.Edge.CFviEdgeResultI32 GetEdge2D_EdgeResultI32(FVIL.Data.CFviImage src)
        {
            // 1) インスタンスの準備.
            FVIL.Edge.CFviEdge2D parser = new FVIL.Edge.CFviEdge2D();
            FVIL.Edge.CFviEdgeResultI32 result = new FVIL.Edge.CFviEdgeResultI32();
            FVIL.Edge.CFviEdge2DSobelParam param = new FVIL.Edge.CFviEdge2DSobelParam();
            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) パラメータ設定 (固有)
            param.EdgeThreshold = 120;
            param.NmsLength = 1;
            parser.Param = param;

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

            return result;
        }
    }
}


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 Hough
        ' ============================================================
        ''' <summary>
        ''' エッジ点の取得.
        ''' </summary>
        ''' <remarks>
        ''' CFviEdge2D.
        ''' CFviEdge2DSobelParam.
        ''' CFviEdgeResultI32.
        ''' </remarks>
        Private Function GetEdge2D_EdgeResultI32(src As FVIL.Data.CFviImage) As FVIL.Edge.CFviEdgeResultI32
            ' 1) インスタンスの準備.
            Dim parser As New FVIL.Edge.CFviEdge2D()
            Dim result As New FVIL.Edge.CFviEdgeResultI32()
            Dim param As New FVIL.Edge.CFviEdge2DSobelParam()
            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) パラメータ設定 (固有)
            param.EdgeThreshold = 120
            param.NmsLength = 1
            parser.Param = param

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

            Return result
        End Function
    End Class
End Namespace

Exceptions

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

See Also