2値画像の構造要素指定 hit-or-miss

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

Syntax

C#
public static int fnFIE_hit_or_miss(
	FHANDLE hsrc_img,
	FHANDLE hdst_img,
	FHANDLE hse_FG,
	FHANDLE hse_BG
)
Visual Basic
Public Shared Function fnFIE_hit_or_miss ( 
	hsrc_img As FHANDLE,
	hdst_img As FHANDLE,
	hse_FG As FHANDLE,
	hse_BG As FHANDLE
) As Integer

Parameters

hsrc_img
Type: fvalgcli..::..FHANDLE
処理対象画像( type: bin )
hdst_img
Type: fvalgcli..::..FHANDLE
処理結果画像( type: bin )
hse_FG
Type: fvalgcli..::..FHANDLE
値が1の画素に対応する構造要素 のハンドル
hse_BG
Type: fvalgcli..::..FHANDLE
値が0の画素に対応する構造要素 のハンドル

Return Value

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

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_INVALID_IMAGE不正な画像ハンドルが渡されたため、異常終了
F_ERR_INVALID_OBJECT 構造要素に不正なハンドルが指定されたため異常終了
F_ERR_NOMEMORYメモリ不足で確保に失敗した
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
    {
        /// <summary>
        /// 2値画像の構造要素指定 hit-or-miss.
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_hit_or_miss()
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE hsrc = FHANDLE.Zero;
            FHANDLE hdst = FHANDLE.Zero;
            FHANDLE hmask = FHANDLE.Zero;
            FHANDLE htemp = FHANDLE.Zero;
            FHANDLE hchild = FHANDLE.Zero;
            FHANDLE hFG = FHANDLE.Zero;
            FHANDLE hBG = FHANDLE.Zero;
            IntPtr pp = FHANDLE.Zero;
            UCHAR_PTR ptrn1 = UCHAR_PTR.Zero;
            UCHAR_PTR ptrn2 = UCHAR_PTR.Zero;

            const int height = 10;
            const int width = 11;
            const int height_r = 256;
            const int width_r = 341;

            byte[] mask = {
                    0,0,0,0,0,1,0,0,1,0,0, //0
                    0,0,0,0,1,1,1,0,1,0,0, //1
                    0,0,0,1,1,1,1,1,1,0,0, //2
                    0,0,1,1,1,1,1,1,1,0,0, //3
                    0,1,1,1,1,1,1,1,1,1,0, //4
                    1,1,1,1,1,1,1,1,1,1,1, //5
                    0,0,1,0,0,0,0,0,1,0,0, //6
                    0,0,1,0,0,0,0,0,1,0,0, //7
                    0,0,1,0,0,0,0,0,1,0,0, //8
                    0,0,1,1,1,1,1,1,1,0,0  //9
                    };

            try
            {
                hsrc = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_BIN, 1, 256, 256);
                hdst = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_BIN, 1, width_r, height_r);
                hmask = FHANDLE.Zero;
                htemp = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_UC8, 1, 256, 256);
                hchild = api.fnFIE_img_child_alloc(hdst, 0, 0, 256, 256);
                hFG = FHANDLE.Zero;
                hBG = FHANDLE.Zero;
                pp = FHANDLE.Zero;

                // 値が1 の画素に対応する構造要素.
                ptrn1 = UCHAR_PTR.alloc(mask.Length);
                for (int i = 0; i < mask.Length; i++)
                    ptrn1[i] = mask[i];

                // 値が0 の画素に対応する構造要素.
                ptrn2 = UCHAR_PTR.alloc(mask.Length);
                for (int i = 0; i < width * height; i++)
                    ptrn2[i] = (byte)((ptrn1[i] == 1) ? 0 : 1);

                // byte配列をFHANDLE配列に変換.
                int size = Marshal.SizeOf(mask[0]) * mask.Length;
                pp = Marshal.AllocHGlobal(size);
                Marshal.Copy(mask, 0, pp, mask.Length);
                IntPtr[] pntr = { pp };

                // 入力画像の生成.
                hmask = api.fnFIE_img_root_import_alloc(pntr, 1, (int)f_imgtype.F_IMG_UC8, width, width, height);
                api.fnFIE_copy_border(hmask, htemp, 0, 0, f_border_mode.F_BORDER_MIRROR2, 0);
                api.fnFIE_img_copy(htemp, hsrc);

                // 構造要素オブジェクトの確保と構造要素の設定.
                hFG = api.fnFIE_morphology_se_alloc(ptrn1, 11, 10, 11, 5, 4);
                hBG = api.fnFIE_morphology_se_alloc(ptrn2, 11, 10, 11, 5, 4);

                // 処理の実行.
                status = api.fnFIE_hit_or_miss(hsrc, hchild, hFG, hBG);

                // エラー判定.
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 出力画像の保存.
                api.fnFIE_save_png(ResultDir + "/fnFIE_hit_or_miss.png", hchild, -1);
            }
            finally
            {
                // オブジェクトの開放.
                hsrc.Dispose();
                hdst.Dispose();
                hmask.Dispose();
                htemp.Dispose();
                hchild.Dispose();
                hFG.Dispose();
                hBG.Dispose();
                ptrn1.Dispose();
                ptrn2.Dispose();
                if (pp != IntPtr.Zero)
                    Marshal.FreeHGlobal(pp);
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

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

Public Partial Class FIE
    ''' <summary>
    ''' 2値画像の構造要素指定 hit-or-miss.
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_hit_or_miss()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim hsrc As FHANDLE = FHANDLE.Zero
        Dim hdst As FHANDLE = FHANDLE.Zero
        Dim hmask As FHANDLE = FHANDLE.Zero
        Dim htemp As FHANDLE = FHANDLE.Zero
        Dim hchild As FHANDLE = FHANDLE.Zero
        Dim hFG As FHANDLE = FHANDLE.Zero
        Dim hBG As FHANDLE = FHANDLE.Zero
        Dim pp As IntPtr = FHANDLE.Zero
        Dim ptrn1 As UCHAR_PTR = UCHAR_PTR.Zero
        Dim ptrn2 As UCHAR_PTR = UCHAR_PTR.Zero

        Const  height As Integer = 10
        Const  width As Integer = 11
        Const  height_r As Integer = 256
        Const  width_r As Integer = 341

        '0
        '1
        '2
        '3
        '4
        '5
        '6
        '7
        '8
            '9
        Dim mask As Byte() = {0, 0, 0, 0, 0, 1, _
            0, 0, 1, 0, 0, 0, _
            0, 0, 0, 1, 1, 1, _
            0, 1, 0, 0, 0, 0, _
            0, 1, 1, 1, 1, 1, _
            1, 0, 0, 0, 0, 1, _
            1, 1, 1, 1, 1, 1, _
            0, 0, 0, 1, 1, 1, _
            1, 1, 1, 1, 1, 1, _
            0, 1, 1, 1, 1, 1, _
            1, 1, 1, 1, 1, 1, _
            0, 0, 1, 0, 0, 0, _
            0, 0, 1, 0, 0, 0, _
            0, 1, 0, 0, 0, 0, _
            0, 1, 0, 0, 0, 0, _
            1, 0, 0, 0, 0, 0, _
            1, 0, 0, 0, 0, 1, _
            1, 1, 1, 1, 1, 1, _
            0, 0}

        Try
            hsrc = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_BIN), 1, 256, 256)
            hdst = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_BIN), 1, width_r, height_r)
            hmask = FHANDLE.Zero
            htemp = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_UC8), 1, 256, 256)
            hchild = api.fnFIE_img_child_alloc(hdst, 0, 0, 256, 256)
            hFG = FHANDLE.Zero
            hBG = FHANDLE.Zero
            pp = FHANDLE.Zero

            ' 値が1 の画素に対応する構造要素.
            ptrn1 = UCHAR_PTR.alloc(mask.Length)
            For i As Integer = 0 To mask.Length - 1
                ptrn1(i) = mask(i)
            Next

            ' 値が0 の画素に対応する構造要素.
            ptrn2 = UCHAR_PTR.alloc(mask.Length)
            For i As Integer = 0 To width * height - 1
                ptrn2(i) = CByte(If((ptrn1(i) = 1), 0, 1))
            Next

            ' byte配列をFHANDLE配列に変換.
            Dim size As Integer = Marshal.SizeOf(mask(0)) * mask.Length
            pp = Marshal.AllocHGlobal(size)
            Marshal.Copy(mask, 0, pp, mask.Length)
            Dim pntr As IntPtr() = {pp}

            ' 入力画像の生成.
            hmask = api.fnFIE_img_root_import_alloc(pntr, 1, CInt(f_imgtype.F_IMG_UC8), width, width, height)
            api.fnFIE_copy_border(hmask, htemp, 0, 0, f_border_mode.F_BORDER_MIRROR2, 0)
            api.fnFIE_img_copy(htemp, hsrc)

            ' 構造要素オブジェクトの確保と構造要素の設定.
            hFG = api.fnFIE_morphology_se_alloc(ptrn1, 11, 10, 11, 5, 4)
            hBG = api.fnFIE_morphology_se_alloc(ptrn2, 11, 10, 11, 5, 4)

            ' 処理の実行.
            status = api.fnFIE_hit_or_miss(hsrc, hchild, hFG, hBG)

            ' エラー判定.
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 出力画像の保存.
            api.fnFIE_save_png(ResultDir & "/fnFIE_hit_or_miss.png", hchild, -1)
        Finally
            ' オブジェクトの開放.
            hsrc.Dispose()
            hdst.Dispose()
            hmask.Dispose()
            htemp.Dispose()
            hchild.Dispose()
            hFG.Dispose()
            hBG.Dispose()
            ptrn1.Dispose()
            ptrn2.Dispose()
            If pp <> IntPtr.Zero Then
                Marshal.FreeHGlobal(pp)
            End If
        End Try
    End Sub
End Class

See Also