計測ライン(円弧)上からの複数エッジ点の検出

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

Syntax

C#
public static int fnFIE_edge1d_arc(
	FHANDLE hsrc,
	F_ARC arc,
	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 sort_mode,
	ref F_DEDGE_PTR edges,
	ref int edge_num
)
Visual Basic
Public Shared Function fnFIE_edge1d_arc ( 
	hsrc As FHANDLE,
	arc As F_ARC,
	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,
	sort_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,s16,us16,double / ch:1)
arc
Type: fvalgcli..::..F_ARC
計測ライン(円弧)
  • x 中心x座標
  • y 中心y座標
  • radius 半径:0 < radius
  • start_angle 開始角:[0,2π]
  • sweep_angle 円弧の角度
prj_width
Type: System..::..Int32
検出片幅(0以上、単位:画素)
  • 0を指定した場合は、計測ライン上のみ有意となる
filter_mode
Type: fvalgcli..::..f_edge1d_filter
エッジ抽出フィルタの指定
  • F_EDGE1D_DOG (微分方式)DoGフィルタ
  • F_EDGE1D_CORR (テンプレートマッチング方式)相関エッジフィルタ
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 を指定した場合
  • 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%
検出されたエッジ点保存配列のポインタ。(外部で確保したメモリのアドレス、または IntPtr.Zero を指定します。)
  • x x座標
  • y y座標(必ず0となる)
  • q 勾配方向
  • mag 強度(0以上)
edge_num
Type: System..::..Int32%
検出されたエッジ点個数
入力の場合は、以下の通りに指定する必要があります
  • edges のメモリを内部確保:指定なし
  • edges のメモリを外部確保:確保したメモリ数を入力

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 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_arc()
        {
            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();

            try
            {
                int edge_num = 0;
                int prj_width = 5;
                int offset = 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_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;
                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 = fvalgcli.api.fnFIE_edge1d_arc(hImageSrc, arc, prj_width, filter_mode, direct_mode, diff_type, diff_thr, sort_mode, ref edges, ref edge_num);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_edge1d_arc: エラーが発生しました。({0})", (f_err)status);
                Console.WriteLine("fnFIE_edge1d_arc");
                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);

                // 計測ライン(円弧)上への座標変換. 
                fnFIE_edge1d_trans_coord_arc(edges, edge_num, arc, offset);
            }
            finally
            {
                hImageSrc.Dispose();
                edges.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_arc()
        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()

        Try
            Dim edge_num As Integer = 0
            Dim prj_width As Integer = 5
            Dim offset 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 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 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 = fvalgcli.api.fnFIE_edge1d_arc(hImageSrc, arc, prj_width, filter_mode, direct_mode, diff_type, _
                diff_thr, sort_mode, edges, edge_num)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_edge1d_arc: エラーが発生しました。({0})", CType(status, f_err))
            Console.WriteLine("fnFIE_edge1d_arc")
            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

            ' 計測ライン(円弧)上への座標変換. 
            fnFIE_edge1d_trans_coord_arc(edges, edge_num, arc, offset)
        Finally
            hImageSrc.Dispose()
            edges.Dispose()
        End Try
    End Sub
End Class

See Also