放射状(収束or発散)方向エッジ検出
Namespace: fvalgcliAssembly: 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() にて四捨五入される。
- 生成された濃度プロファイル内の最大値と最小値の差に対する割合。
- 求められた閾値は、 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 |
---|---|
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 |
---|---|
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 |