放射状(収束or発散)方向エッジ検出

Namespace: fvalgcli
Assembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)

Syntax

C#
public static int fnFIE_edge1d_radial(
	FHANDLE hsrc,
	DPNT_T center,
	int start_radius,
	int range_radius,
	double start_angle,
	double range_angle,
	int line_num,
	f_edge1d_projection_mode prj_mode,
	int prj_width,
	f_edge1d_filter filter_mode,
	f_edge1d_edge_direction direct_mode,
	f_diff_type diff_type,
	double diff_thr,
	f_edge1d_sort_mode detect_mode,
	ref F_DEDGE_PTR edges,
	ref int edge_num
)
Visual Basic
Public Shared Function fnFIE_edge1d_radial ( 
	hsrc As FHANDLE,
	center As DPNT_T,
	start_radius As Integer,
	range_radius As Integer,
	start_angle As Double,
	range_angle As Double,
	line_num As Integer,
	prj_mode As f_edge1d_projection_mode,
	prj_width As Integer,
	filter_mode As f_edge1d_filter,
	direct_mode As f_edge1d_edge_direction,
	diff_type As f_diff_type,
	diff_thr As Double,
	detect_mode As f_edge1d_sort_mode,
	ByRef edges As F_DEDGE_PTR,
	ByRef edge_num As Integer
) As Integer

Parameters

hsrc
Type: fvalgcli..::..FHANDLE
入力画像(type:uc8,us16,double / ch:1)
center
Type: fvalgcli..::..DPNT_T
計測円の中心座標
start_radius
Type: System..::..Int32
検出ラインの開始半径(0以上)
range_radius
Type: System..::..Int32
検出ラインの処理範囲半径
start_angle
Type: System..::..Double
開始角度(radian)
range_angle
Type: System..::..Double
処理範囲角度(radian)
line_num
Type: System..::..Int32
検出ライン本数(1以上)
prj_mode
Type: fvalgcli..::..f_edge1d_projection_mode
濃度投影方法の指定。
  • F_PROJECTION_BOX: 矩形型濃度投影。
  • F_PROJECTION_FAN: 扇型濃度投影。
prj_width
Type: System..::..Int32
濃度投影片幅(0以上、単位:画素)0 を指定した場合は、計測ライン上のみ有意となる。
filter_mode
Type: fvalgcli..::..f_edge1d_filter
エッジ抽出フィルタの指定。
  • F_BRI_TO_DRK: 明→暗のエッジ。
  • F_DTC_BOTH: 両極性。
direct_mode
Type: fvalgcli..::..f_edge1d_edge_direction
検出するエッジ方向の指定。
  • F_DRK_TO_BRI: 暗→明のエッジ。
  • F_EDGE1D_DOG: (微分方式)DoGフィルタ。
  • F_EDGE1D_CORR: (テンプレートマッチング方式)相関エッジフィルタ。
diff_type
Type: fvalgcli..::..f_diff_type
濃度差閾値の種別。
  • F_ABSOLUTE_THR: 絶対濃度差。
  • F_RELATIVE_THR: 相対濃度差。
diff_thr
Type: System..::..Double
エッジの最小濃度差閾値。 F_ABSOLUTE_THR を指定した場合:
  • 画素タイプが F_IMG_UC8 の場合:[0,255]
  • 画素タイプが F_IMG_US16 の場合:[0,65535]
  • 画素タイプが F_IMG_System.Double の場合:[0, 2147483647]
  • 内部で fnFIE_d4i5() にて四捨五入される。
F_RELATIVE_THR を指定した場合:[0,100](%)
  • 生成された濃度プロファイル内の最大値と最小値の差に対する割合。
  • 求められた閾値は、 fnFIE_d4i5() にて四捨五入される。
detect_mode
Type: fvalgcli..::..f_edge1d_sort_mode
各計測ラインで検出されたエッジ点の出力方法を指定。
  • F_MAG_SORT: エッジ強度が最大となる点。
  • F_POS_SORT: 開始半径に一番近い点。
edges
Type: fvalgcli..::..F_DEDGE_PTR%
検出されたエッジ点保存配列のポインタ。開始角度から順に格納されます。
edge_num
Type: System..::..Int32%
検出されたエッジ点個数。 入力の場合は、以下の通りに指定する必要があります。
  • edges のメモリを内部確保:指定なし。
  • edges のメモリを外部確保:確保したメモリ数を入力。(edge_num≧line_num)

Return Value

Type: Int32
以下のエラーコードを返します。

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_INVALID_IMAGE不正な画像オブジェクト
F_ERR_INVALID_PARAM不正なパラメータ
F_ERR_NOMEMORYメモリ不足エラー
F_ERR_NO_LICENCEライセンスエラー

Examples

C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using fvalgcli;

namespace TC
{
    public partial class FIE
    {
        [FvPluginExecute]
        public void fnFIE_edge1d_radial()
        {
            string filepath = TestImageDir + "/SampleCode/disk_cap_01.png";

            int status = (int)f_err.F_ERR_NONE;
            FHANDLE hsrc = FHANDLE.Zero;
            F_DEDGE_PTR edges = new F_DEDGE_PTR();

            FHANDLE hdst = FHANDLE.Zero;        // 結果画像.
            DOUBLE_PTR val = DOUBLE_PTR.Zero;    // 画像に描画する際の濃度値.

            try
            {
                DPNT_T center = DPNT_T.init(163, 124);
                int start_radius = 50;
                int range_radius = 100;
                double start_angle = 0;
                double range_angle = 2 * System.Math.PI;
                int line_num = 36;
                f_edge1d_projection_mode prj_mode = f_edge1d_projection_mode.F_PROJECTION_BOX;
                int prj_width = 10;
                f_edge1d_filter filter_mode = f_edge1d_filter.F_EDGE1D_CORR;
                f_edge1d_edge_direction direct_mode = f_edge1d_edge_direction.F_BRI_TO_DRK;
                f_diff_type diff_type = f_diff_type.F_RELATIVE_THR;
                double diff_thr = 10;
                f_edge1d_sort_mode detect_mode = f_edge1d_sort_mode.F_POS_SORT;
                int edge_num = 0;

                api.fnFIE_load_img_file(filepath, ref hsrc, f_color_img_type.F_COLOR_IMG_TYPE_UC8);

                // エッジ検出実行.
                status = fvalgcli.api.fnFIE_edge1d_radial(hsrc, center, start_radius, range_radius,
                    start_angle, range_angle, line_num, prj_mode, prj_width,
                    filter_mode, direct_mode, diff_type, diff_thr, detect_mode, ref edges, ref edge_num);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_edge1d_radial: エラーが発生しました。({0})", (f_err)status);

                // 処理結果の確認.
                Console.WriteLine("fnFIE_edge1d_radial");
                for (int i = 0; i < edge_num; i++)
                {
                    Console.WriteLine("edges[{0}]=({1}, {2}, {3}, {4})", i, edges[i].x, edges[i].y, edges[i].q, edges[i].mag);
                }

                // 処理結果の確認.(描画)
                int width = api.fnFIE_img_get_width(hsrc);
                int height = api.fnFIE_img_get_height(hsrc);

                hdst = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_RGBQUAD, 1, width, height);
                api.fnFIE_img_copy(hsrc, hdst);

                // 点列描画用変数初期化.
                val = DOUBLE_PTR.alloc(3);

                // 中心点の描画.
                val[0] = 0;        //R.
                val[1] = 0;        //G.
                val[2] = 255;    //B.
                api.fnFIE_draw_point(hdst, val, center);

                // エッジ点の描画.
                val[0] = 255;    //R.
                val[1] = 0;        //G.
                val[2] = 0;        //B.
                for (int i = 0; i < edge_num; i++)
                {
                    DPNT_T point = DPNT_T.init(edges[i].x, edges[i].y);
                    api.fnFIE_draw_point(hdst, val, point);
                }

                // 画像をPNG形式で保存する.
                api.fnFIE_save_png(ResultDir + "/fnFIE_edge1d_radial.png", hdst, -1);
            }
            finally
            {
                hsrc.Dispose();
                edges.Dispose();
                hdst.Dispose();
                val.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports fvalgcli

Public Partial Class FIE
    <FvPluginExecute> _
    Public Sub fnFIE_edge1d_radial()
        Dim filepath As String = TestImageDir & "/SampleCode/disk_cap_01.png"

        Dim status As Integer = CInt(f_err.F_ERR_NONE)
        Dim hsrc As FHANDLE = FHANDLE.Zero
        Dim edges As New F_DEDGE_PTR()

        Dim hdst As FHANDLE = FHANDLE.Zero
        ' 結果画像.
        Dim val As DOUBLE_PTR = DOUBLE_PTR.Zero
        ' 画像に描画する際の濃度値.
        Try
            Dim center As DPNT_T = DPNT_T.init(163, 124)
            Dim start_radius As Integer = 50
            Dim range_radius As Integer = 100
            Dim start_angle As Double = 0
            Dim range_angle As Double = 2 * System.Math.PI
            Dim line_num As Integer = 36
            Dim prj_mode As f_edge1d_projection_mode = f_edge1d_projection_mode.F_PROJECTION_BOX
            Dim prj_width As Integer = 10
            Dim filter_mode As f_edge1d_filter = f_edge1d_filter.F_EDGE1D_CORR
            Dim direct_mode As f_edge1d_edge_direction = f_edge1d_edge_direction.F_BRI_TO_DRK
            Dim diff_type As f_diff_type = f_diff_type.F_RELATIVE_THR
            Dim diff_thr As Double = 10
            Dim detect_mode As f_edge1d_sort_mode = f_edge1d_sort_mode.F_POS_SORT
            Dim edge_num As Integer = 0

            api.fnFIE_load_img_file(filepath, hsrc, f_color_img_type.F_COLOR_IMG_TYPE_UC8)

            ' エッジ検出実行.
            status = fvalgcli.api.fnFIE_edge1d_radial(hsrc, center, start_radius, range_radius, start_angle, range_angle, _
                line_num, prj_mode, prj_width, filter_mode, direct_mode, diff_type, _
                diff_thr, detect_mode, edges, edge_num)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_edge1d_radial: エラーが発生しました。({0})", CType(status, f_err))

            ' 処理結果の確認.
            Console.WriteLine("fnFIE_edge1d_radial")
            For i As Integer = 0 To edge_num - 1
                Console.WriteLine("edges[{0}]=({1}, {2}, {3}, {4})", i, edges(i).x, edges(i).y, edges(i).q, edges(i).mag)
            Next

            ' 処理結果の確認.(描画)
            Dim width As Integer = api.fnFIE_img_get_width(hsrc)
            Dim height As Integer = api.fnFIE_img_get_height(hsrc)

            hdst = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_RGBQUAD, 1, width, height)
            api.fnFIE_img_copy(hsrc, hdst)

            ' 点列描画用変数初期化.
            val = DOUBLE_PTR.alloc(3)

            ' 中心点の描画.
            val(0) = 0
            'R.
            val(1) = 0
            'G.
            val(2) = 255
            'B.
            api.fnFIE_draw_point(hdst, val, center)

            ' エッジ点の描画.
            val(0) = 255
            'R.
            val(1) = 0
            'G.
            val(2) = 0
            'B.
            For i As Integer = 0 To edge_num - 1
                Dim point As DPNT_T = DPNT_T.init(edges(i).x, edges(i).y)
                api.fnFIE_draw_point(hdst, val, point)
            Next

            ' 画像をPNG形式で保存する.
            api.fnFIE_save_png(ResultDir & "/fnFIE_edge1d_radial.png", hdst, -1)
        Finally
            hsrc.Dispose()
            edges.Dispose()
            hdst.Dispose()
            val.Dispose()
        End Try
    End Sub
End Class

See Also