計測ライン(円弧)上からの複数エッジ点の検出
Namespace: fvalgcliAssembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)
Syntax
C# |
---|
public static int fnFIE_edge1d_arc2( FHANDLE hsrc, F_ARC arc, int prj_width, 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, ref F_DEDGE_PTR edges, ref int edge_num, ref INT_PTR diff, ref int diff_len ) |
Visual Basic |
---|
Public Shared Function fnFIE_edge1d_arc2 ( hsrc As FHANDLE, arc As F_ARC, prj_width 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, ByRef edges As F_DEDGE_PTR, ByRef edge_num As Integer, ByRef diff As INT_PTR, ByRef diff_len As Integer ) As Integer |
Parameters
- hsrc
- Type: fvalgcli..::..FHANDLE
入力画像(type:uc8,s16,us16,double / ch:1)
- arc
- Type: fvalgcli..::..F_ARC
計測ライン(円弧)
fnFIE_edge1d_calc_projection_arc_length(F_ARC, Int32%) で求められる計測ラインの長さが arnd * 2 + diff_filter 以上でなければなりません- 不正なハンドルが渡されたため、異常終了した
- 移動後の座標は32bit整数の表示範囲以外になるため、異常終了した
- x 中心x座標
- y 中心y座標
- radius 半径:0 < radius
- start_angle 開始角:[0,2π]
- sweep_angle 円弧の角度
- prj_width
- Type: System..::..Int32
検出片幅(0以上、単位:画素)- 0を指定した場合は、計測ライン上のみ有意となる
- 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以上、単位:画素)
エッジ計測に利用された1次微分データ上で、 取得される隣り合うエッジ間の距離は少なくとも interval 以上となる。 例えば、 interval が0であれば、連続した座標でエッジが取得されることがある。 interval が1であれば、連続した座標でエッジが取得されることはない。 少なくとも隣り合うエッジ間の距離は、1以上となる。
- direct_mode
- Type: fvalgcli..::..f_edge1d_edge_direction
検出するエッジ方向の指定- minus_foot F_DRK_TO_BRI 暗→明のエッジ
- minus_len F_BRI_TO_DRK 明→暗のエッジ
- plus_foot F_DTC_BOTH 両極性
- diff_type
- Type: fvalgcli..::..f_diff_type
濃度差閾値の種別- F_ABSOLUTE_THR 絶対濃度差
- F_RELATIVE_THR 相対濃度差
- diff_thr
- Type: System..::..Double
エッジの最小濃度差閾値- F_ABSOLUTE_THR を指定した場合
- 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%
F_POS_SORT 始点からの位置順。(外部で確保したメモリのアドレス、または IntPtr.Zero を指定します。)- x x座標
- y y座標(必ず0となる)
- q 勾配方向
- mag 強度(0以上)
- edge_num
- Type: System..::..Int32%
検出されたエッジ点個数
入力の場合は、以下の通りに指定する必要があります- edges のメモリを内部確保:指定なし
- edges のメモリを外部確保:確保したメモリ数を入力
- mag 強度(0以上)
- diff
- Type: fvalgcli..::..INT_PTR%
1次微分データ保存用配列のポインタ。(外部で確保したメモリのアドレス、または IntPtr.Zero を指定します。)
- diff_len
- Type: System..::..Int32%
1次微分データ保存用配列の長さ
入力の場合は、以下の通りに指定する必要があります- diff のメモリを内部確保:指定なし
- diff のメモリを外部確保:確保したメモリ数を入力
Return Value
Type: Int32以下のエラーコードを返します。
エラーコード:
f_err | 内容 |
---|---|
F_ERR_NONE | 正常終了 |
F_ERR_NOMEMORY | メモリ不足エラー |
F_ERR_INVALID_IMAGE | 不正な画像が渡された |
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_arc2() { string filepath = TestImageDir + "/testdata/image_file_8bpp.bmp"; int status = (int)f_err.F_ERR_NONE; FHANDLE hImageSrc = FHANDLE.Zero; F_DEDGE_PTR edges = new F_DEDGE_PTR(); INT_PTR diff = new INT_PTR(); try { int edge_num = 0; int prj_width = 5; int diff_len = 0; int arnd = 0; int interval = 0; double diff_thr = 10; F_ARC arc = new F_ARC(); arc.x = 200; arc.y = 200; arc.radius = 100; arc.start_angle = 0; arc.sweep_angle = Math.PI * 2; F_EDGE1D_DIFF_FILTER diff_filter; diff_filter.minus_foot = 1; diff_filter.minus_len = 0; diff_filter.plus_foot = 1; diff_filter.plus_len = 0; 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; api.fnFIE_load_bmp(filepath, ref hImageSrc, f_color_img_type.F_COLOR_IMG_TYPE_UC8); // 計測ライン(円弧)の長さを計算. fnFIE_edge1d_calc_projection_arc_length(arc); // エッジ検出実行. status = api.fnFIE_edge1d_arc2(hImageSrc, arc, prj_width, diff_filter, arnd, interval, direct_mode, diff_type, diff_thr, sort_mode, ref edges, ref edge_num, ref diff, ref diff_len); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_edge1d_arc2: エラーが発生しました。({0})", (f_err)status); Console.WriteLine("fnFIE_edge1d_arc2"); 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 { hImageSrc.Dispose(); edges.Dispose(); diff.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_arc2() Dim filepath As String = TestImageDir & "/testdata/image_file_8bpp.bmp" Dim status As Integer = CInt(f_err.F_ERR_NONE) Dim hImageSrc As FHANDLE = FHANDLE.Zero Dim edges As New F_DEDGE_PTR() Dim diff As New INT_PTR() Try Dim edge_num As Integer = 0 Dim prj_width As Integer = 5 Dim diff_len As Integer = 0 Dim arnd As Integer = 0 Dim interval As Integer = 0 Dim diff_thr As Double = 10 Dim arc As New F_ARC() arc.x = 200 arc.y = 200 arc.radius = 100 arc.start_angle = 0 arc.sweep_angle = Math.PI * 2 Dim diff_filter As F_EDGE1D_DIFF_FILTER diff_filter.minus_foot = 1 diff_filter.minus_len = 0 diff_filter.plus_foot = 1 diff_filter.plus_len = 0 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 api.fnFIE_load_bmp(filepath, hImageSrc, f_color_img_type.F_COLOR_IMG_TYPE_UC8) ' 計測ライン(円弧)の長さを計算. fnFIE_edge1d_calc_projection_arc_length(arc) ' エッジ検出実行. status = api.fnFIE_edge1d_arc2(hImageSrc, arc, prj_width, diff_filter, arnd, interval, _ direct_mode, diff_type, diff_thr, sort_mode, edges, edge_num, _ diff, diff_len) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_edge1d_arc2: エラーが発生しました。({0})", CType(status, f_err)) Console.WriteLine("fnFIE_edge1d_arc2") 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 hImageSrc.Dispose() edges.Dispose() diff.Dispose() End Try End Sub End Class |