DoGフィルタによるエッジ検出
Namespace: fvalgcliAssembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)
Syntax
C# |
---|
public static int fnFIE_edge1d_detect_edges_DoG( DOUBLE_PTR pprj, int prj_len, 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 ) |
Visual Basic |
---|
Public Shared Function fnFIE_edge1d_detect_edges_DoG ( pprj As DOUBLE_PTR, prj_len 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 ) As Integer |
Parameters
- pprj
- Type: fvalgcli..::..DOUBLE_PTR
濃度プロファイル配列
- prj_len
- Type: System..::..Int32
濃度プロファイル配列の長さ- prj_len ≧ 8
- direct_mode
- Type: fvalgcli..::..f_edge1d_edge_direction
検出するエッジ方向の指定- F_DRK_TO_BRI 暗→明のエッジ
- F_BRI_TO_DRK 明→暗のエッジ
- F_DTC_BOTH 両極性
- 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%
検出されたエッジ点個数
Return Value
Type: Int32以下のエラーコードを返します。
エラーコード:
f_err | 内容 |
---|---|
F_ERR_NONE | 正常終了 |
F_ERR_NOMEMORY | メモリ不足エラー |
F_ERR_INVALID_PARAM
不正なパラメータが渡された
| |
F_ERR_NODATA | 濃度プロファイルに有効領域が存在しない |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Examples
C# | Copy |
---|---|
// $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_DoG() { 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; 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; double diff_thr = 75; // 計測ラインの長さを計算. int length = 0; api.fnFIE_edge1d_calc_projection_line_length(line, ref length); prj_len = (int)(length + 0.5); 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(); 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_DoG(pprj, prj_len, direct_mode, diff_type, diff_thr, sort_mode, edges, edge_len, ref edge_num); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_edge1d_detect_edges_DoG: エラーが発生しました。({0})", (f_err)status); Console.WriteLine("fnFIE_edge1d_detect_edges_DoG"); 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 |
---|---|
' $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_DoG() 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 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 diff_thr As Double = 75 ' 計測ラインの長さを計算. Dim length As Integer = 0 api.fnFIE_edge1d_calc_projection_line_length(line, length) prj_len = CInt(Math.Truncate(length + 0.5)) 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(); 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_DoG(pprj, prj_len, direct_mode, diff_type, diff_thr, sort_mode, _ edges, edge_len, edge_num) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_edge1d_detect_edges_DoG: エラーが発生しました。({0})", CType(status, f_err)) Console.WriteLine("fnFIE_edge1d_detect_edges_DoG") 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 |