1次微分によるエッジ検出

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

Syntax

C#
public static int fnFIE_edge1d_detect_edges_diff(
	DOUBLE_PTR pprj,
	int prj_len,
	F_EDGE1D_DIFF_FILTER diff_filter,
	int arnd,
	int interval,
	f_edge1d_edge_direction direct_mode,
	f_diff_type diff_type,
	double diff_thr,
	f_edge1d_sort_mode sort_mode,
	F_DEDGE_PTR edges,
	int edge_len,
	ref int edge_num,
	INT_PTR diff,
	int diff_len
)
Visual Basic
Public Shared Function fnFIE_edge1d_detect_edges_diff ( 
	pprj As DOUBLE_PTR,
	prj_len As Integer,
	diff_filter As F_EDGE1D_DIFF_FILTER,
	arnd As Integer,
	interval As Integer,
	direct_mode As f_edge1d_edge_direction,
	diff_type As f_diff_type,
	diff_thr As Double,
	sort_mode As f_edge1d_sort_mode,
	edges As F_DEDGE_PTR,
	edge_len As Integer,
	ByRef edge_num As Integer,
	diff As INT_PTR,
	diff_len As Integer
) As Integer

Parameters

pprj
Type: fvalgcli..::..DOUBLE_PTR
濃度プロファイル配列
prj_len
Type: System..::..Int32
濃度プロファイル配列の長さ
  • prj_lne ≧ ( arnd + diff_filter.minus_foot + diff_filter.minus_len + diff_filter.plus_len + diff_filter.plus_foot + arnd )
diff_filter
Type: fvalgcli..::..F_EDGE1D_DIFF_FILTER
微分フィルタの指定
  • minus_foot 負側のfoot長さ(1以上)
  • minus_len 負側のlen長さ(0以上)
  • plus_foot 正側のfoot長さ(1以上)
  • plus_len 正側のlen長さ(0以上)
arnd
Type: System..::..Int32
サブピクセル計算に使用する周辺情報の片幅(0以上)
検出した濃度微分データのピーク位置(または、または最初に閾値を超えた位置)に対して、 ここで指定した画素分の両端の濃度微分データを使用して サブピクセル精度の計算をする
interval
Type: System..::..Int32
エッジ取得間隔(0以上)
direct_mode
Type: fvalgcli..::..f_edge1d_edge_direction
検出するエッジ方向の指定
  • F_DRK_TO_BRI 暗→明のエッジ
  • F_BRI_TO_DRK 明→暗のエッジ
  • F_DTC_BOTH 両極性(1以上)
diff_type
Type: fvalgcli..::..f_diff_type
濃度差閾値の種別
  • F_ABSOLUTE_THR 絶対濃度差
  • F_RELATIVE_THR 相対濃度差
diff_thr
Type: System..::..Double
エッジの最小濃度差閾値
  • F_ABSOLUTE_THR を指定した場合:[0, 2147483647]
  • F_RELATIVE_THR を指定した場合:[0,100](%)
sort_mode
Type: fvalgcli..::..f_edge1d_sort_mode
検出されたエッジの保存順を指定
  • F_MAG_SORT 強度順
  • F_POS_SORT 始点からの位置順
edges
Type: fvalgcli..::..F_DEDGE_PTR
検出されたエッジ点保存配列のポインタ
  • x x座標
  • y y座標(必ず0となる)
  • q 勾配方向
  • mag 強度(0以上)
edge_len
Type: System..::..Int32
エッジ点配列の長さ
  • edge_len ≧ prj_len
edge_num
Type: System..::..Int32%
検出されたエッジ点個数
diff
Type: fvalgcli..::..INT_PTR
1次微分データ(必要ない場合は IntPtr.Zero)
diff_len
Type: System..::..Int32
1次微分データの長さ
  • edge_len ≧ prj_len

Return Value

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

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_NOMEMORYメモリ不足エラー
F_ERR_INVALID_PARAM不正なパラメータが渡された
  • pprj , edges または edge_num が IntPtr.Zero
  • diff_filter , arnd または interval が不正な値
  • direct_mode , diff_type, diff_thr または sort_mode が不正な値
  • prj_len > edge_len
  • prj_len < arnd + diff_filter.minus_foot + diff_filter.minus_len + diff_filter.plus_len + diff_filter.plus_foot + arnd
  • diff または diff_len が不正な値
F_ERR_NODATA 濃度プロファイルに有効領域が存在しない
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Examples

C# Copy imageCopy
//    $Revision: 1.1 $

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_detect_edges_diff()
        {
            string filepath = TestImageDir + "/testdata/image_file_8bpp.bmp";

            int status = (int)f_err.F_ERR_NONE;
            FHANDLE hImage = FHANDLE.Zero;
            F_DEDGE_PTR edges = F_DEDGE_PTR.Zero;
            DOUBLE_PTR pprj = DOUBLE_PTR.Zero;
            INT_PTR diff = INT_PTR.Zero;

            try
            {
                DSGMT_T line;
                line.st.x = 50;
                line.st.y = 250;
                line.ed.x = 450;
                line.ed.y = 250;
                //int prj_width = 0;
                int prj_len = 0;
                int edge_num = 0;
                int edge_len = 0;
                int arnd = 0;
                int interval = 0;
                int diff_len = 10;
                double diff_thr = 75;

                // 計測ラインの長さを計算.
                api.fnFIE_edge1d_calc_projection_line_length(line, ref prj_len);
                edge_len = prj_len;

                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;
                f_edge1d_sort_mode sort_mode = f_edge1d_sort_mode.F_MAG_SORT;
                edges = F_DEDGE_PTR.alloc(edge_len);
                pprj = DOUBLE_PTR.alloc(prj_len);
                //F_ARRAY_INDEX valid_reg = new F_ARRAY_INDEX();
                F_EDGE1D_DIFF_FILTER diff_filter = new F_EDGE1D_DIFF_FILTER();
                diff_filter.minus_foot = 1;
                diff_filter.minus_len = 0;
                diff_filter.plus_foot = 1;
                diff_filter.plus_len = 0;

                api.fnFIE_load_bmp(filepath, ref hImage, f_color_img_type.F_COLOR_IMG_TYPE_UC8);

                // プロジェクション作成.
                //status = api.fnFIE_edge1d_projection_line(hImage, line, prj_width, pprj, prj_len, ref valid_reg);
                //Console.WriteLine(status);
                //Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_edge1d_projection_line: エラーが発生しました。({0})", (f_err)status);
                //Console.WriteLine("fnFIE_edge1d_projection_line");

                // エッジ検出実行.
                status = api.fnFIE_edge1d_detect_edges_diff(pprj, prj_len, diff_filter, arnd, interval, direct_mode, diff_type, diff_thr, sort_mode, edges, edge_len, ref edge_num, diff, diff_len);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_edge1d_detect_edges_diff: エラーが発生しました。({0})", (f_err)status);
                Console.WriteLine("fnFIE_edge1d_detect_edges_diff");
                for (int i = 0; i < edge_num; i++)
                    Console.WriteLine("edge[{0}]=({1}, {2}, {3}, {4})", i, edges[i].x, edges[i].y, edges[i].q, edges[i].mag);
            }
            finally
            {
                hImage.Dispose();
                edges.Dispose();
                pprj.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports fvalgcli

Public Partial Class FIE
    <FvPluginExecute> _
    Public Sub fnFIE_edge1d_detect_edges_diff()
        Dim filepath As String = TestImageDir & "/testdata/image_file_8bpp.bmp"

        Dim status As Integer = CInt(f_err.F_ERR_NONE)
        Dim hImage As FHANDLE = FHANDLE.Zero
        Dim edges As F_DEDGE_PTR = F_DEDGE_PTR.Zero
        Dim pprj As DOUBLE_PTR = DOUBLE_PTR.Zero
        Dim diff As INT_PTR = INT_PTR.Zero

        Try
            Dim line As DSGMT_T
            line.st.x = 50
            line.st.y = 250
            line.ed.x = 450
            line.ed.y = 250
            'int prj_width = 0;
            Dim prj_len As Integer = 0
            Dim edge_num As Integer = 0
            Dim edge_len As Integer = 0
            Dim arnd As Integer = 0
            Dim interval As Integer = 0
            Dim diff_len As Integer = 10
            Dim diff_thr As Double = 75

            ' 計測ラインの長さを計算.
            api.fnFIE_edge1d_calc_projection_line_length(line, prj_len)
            edge_len = prj_len

            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 sort_mode As f_edge1d_sort_mode = f_edge1d_sort_mode.F_MAG_SORT
            edges = F_DEDGE_PTR.alloc(edge_len)
            pprj = DOUBLE_PTR.alloc(prj_len)
            'F_ARRAY_INDEX valid_reg = new F_ARRAY_INDEX();
            Dim diff_filter As New F_EDGE1D_DIFF_FILTER()
            diff_filter.minus_foot = 1
            diff_filter.minus_len = 0
            diff_filter.plus_foot = 1
            diff_filter.plus_len = 0

            api.fnFIE_load_bmp(filepath, hImage, f_color_img_type.F_COLOR_IMG_TYPE_UC8)

            ' プロジェクション作成.
            'status = api.fnFIE_edge1d_projection_line(hImage, line, prj_width, pprj, prj_len, ref valid_reg);
            'Console.WriteLine(status);
            'Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_edge1d_projection_line: エラーが発生しました。({0})", (f_err)status);
            'Console.WriteLine("fnFIE_edge1d_projection_line");

            ' エッジ検出実行.
            status = api.fnFIE_edge1d_detect_edges_diff(pprj, prj_len, diff_filter, arnd, interval, direct_mode, _
                diff_type, diff_thr, sort_mode, edges, edge_len, edge_num, _
                diff, diff_len)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_edge1d_detect_edges_diff: エラーが発生しました。({0})", CType(status, f_err))
            Console.WriteLine("fnFIE_edge1d_detect_edges_diff")
            For i As Integer = 0 To edge_num - 1
                Console.WriteLine("edge[{0}]=({1}, {2}, {3}, {4})", i, edges(i).x, edges(i).y, edges(i).q, edges(i).mag)
            Next
        Finally
            hImage.Dispose()
            edges.Dispose()
            pprj.Dispose()
        End Try
    End Sub
End Class

See Also