関数

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

Syntax

C#
public abstract class api
Visual Basic
Public MustInherit Class api

Remarks

このクラスは、FIE 関数を局所化する事を目的に定義されています。
詳細については、別冊 FIE ライブラリ説明書 (FIE.chm) をご参照ください。 当マニュアルは、インテリセンスに表示される部分の記載と C# のサンプルコードを目的としており、機能の詳細説明は省略しています。


トピック:


ライブラリの初期化と終了:

本ライブラリを単独で使用する場合は FIE ライブラリの初期化 が必要です。 アプリケーションの main 等で、下記のように fnFIE_setup()()()() を実行してください。
FVIL と併用する場合は、この作業は不要です。 FVIL ライブラリの初期化(InitVisionLibrary()()()())を実行する際に本ライブラリも初期化されます。
FGA ライブラリ (GPU 版) を使用する場合は、別途 初期化関数をコールする必要があります。 FGA ライブラリの関数には、fnFGA_ プレフィックスが付加されています。

ソースコード:
C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;

namespace User.SampleCode.FIE
{
    public class fvalgcli1
    {
        /// <summary>
        /// ライブラリの初期化と終了処理.
        /// </summary>
        public void Direction1()
        {
            // 1) ライブラリの初期化.
            fvalgcli.api.fnFIE_setup();

            // 
            // 2) ここで画像処理を行います.
            // 

            // 3) ライブラリの終了処理.
            fvalgcli.api.fnFIE_teardown();
        }

        /// <summary>
        /// ライブラリの初期化状態の確認.
        /// </summary>
        public void Direction2()
        {
            // 1) ライブラリの初期化状態を確認します.
            if (fvalgcli.api.fnFIE_is_setuped() == false)
                fvalgcli.api.fnFIE_setup();
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text

Namespace User.SampleCode.FIE
    Public Class fvalgcli1
        ''' <summary>
        ''' ライブラリの初期化と終了処理.
        ''' </summary>
        Public Sub Direction1()
            ' 1) ライブラリの初期化.
            fvalgcli.api.fnFIE_setup()

            '
            ' 2) ここで画像処理を行います.
            '

            ' 3) ライブラリの終了処理.
            fvalgcli.api.fnFIE_teardown()
        End Sub

        ''' <summary>
        ''' ライブラリの初期化状態の確認.
        ''' </summary>
        Public Sub Direction2()
            ' 1) ライブラリの初期化状態を確認します.
            If fvalgcli.api.fnFIE_is_setuped() = False Then
                fvalgcli.api.fnFIE_setup()
            End If
        End Sub
    End Class
End Namespace

[↑戻る]


FGA ライブラリ (.NET 版) の使用:

FGA ライブラリ(FAST GPU Accellerator Library)の .NET 版の関数は、 fvalgcli_fga アセンブリの fvalgcli.fga に集約されています。 これらの関数を使用する場合は FGA ライブラリの初期化 が必要です。 アプリケーションの main 等で、下記のように fvalgcli.fga.fnFGA_setup を実行してください。
FVIL と併用する場合も、この作業は必要です。

FGA ライブラリは NVIDIA CUDA Runtime に依存しています。 NVIDIA CUDA Runtime がインストールされていない環境で FGA 関数(fnFGA_ プレフィックス)を呼び出すと FileNotFoundException 例外が発行されます。 FGA ライブラリの呼び出しが可能か否かを判断するには、 fvalgcli.fga.fnFGA_setup の戻り値を確認するか、 fvalgcli.fga.fnFGA_is_setuped を使用してください。

必要な条件(CUDA のバージョン等)については、別冊 FGA ライブラリ説明書 をご参照ください。

ソースコード:
C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;

namespace User.SampleCode.FIE
{
    public class fvalgcli1_fga
    {
        /// <summary>
        /// ライブラリの初期化と終了処理.
        /// </summary>
        public void Direction1()
        {
            // 1) ライブラリの初期化.
            int status1 = fvalgcli.api.fnFIE_setup();
            int status2 = fvalgcli.fga.fnFGA_setup();

            if (status2 == (int)fvalgcli.f_err.F_ERR_NONE)
            {
                // 
                // 2) ここで画像処理を行います.
                // 
            }

            // 3) ライブラリの終了処理.
            fvalgcli.fga.fnFGA_teardown();
            fvalgcli.api.fnFIE_teardown();
        }

        /// <summary>
        /// ライブラリの初期化状態の確認.
        /// </summary>
        public void Direction2()
        {
            // 1) ライブラリの初期化状態を確認します.
            if (fvalgcli.fga.fnFGA_is_setuped() == true)
            {
                // 
                // 2) ここで画像処理を行います.
                // 
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text

Namespace User.SampleCode.FIE
    Public Class fvalgcli1_fga
        ''' <summary>
        ''' ライブラリの初期化と終了処理.
        ''' </summary>
        Public Sub Direction1()
            ' 1) ライブラリの初期化.
            Dim status1 As Integer = fvalgcli.api.fnFIE_setup()
            Dim status2 As Integer = fvalgcli.fga.fnFGA_setup()

            If status2 = CInt(fvalgcli.f_err.F_ERR_NONE) Then
                '
                ' 2) ここで画像処理を行います.
                '
            End If

            ' 3) ライブラリの終了処理.
            fvalgcli.fga.fnFGA_teardown()
            fvalgcli.api.fnFIE_teardown()
        End Sub

        ''' <summary>
        ''' ライブラリの初期化状態の確認.
        ''' </summary>
        Public Sub Direction2()
            ' 1) ライブラリの初期化状態を確認します.
            If fvalgcli.fga.fnFGA_is_setuped() = True Then
                '
                ' 2) ここで画像処理を行います.
                '
            End If
        End Sub
    End Class
End Namespace

[↑戻る]


非対応の機能:

本ライブラリは DllImport を使用して FIE ライブラリ (fvalgmt, fvalg_oss_mt, fvalg_camcalib_mt 等)の ほぼすべての関数をラッピングしていますが、一部実装していない機能があります。 本ライブラリで実装していない機能に関しては、サポート対象外とします。

表) 未実装の機能
  • fvsteam を使用する関数
    • fnFIE_mat_aread
    • fnFIE_mat_awrite
    • fnFIE_mat_vread
    • fnFIE_mat_vwrite
    • fnFIE_read_imgdata
    • fnFIE_write_imgdata
  • 可変長配列(fnFIE_vectarray_ プレフィックスの関数)
  • 単方向リスト(fnFIE_slist_ プレフィックスの関数)
  • 両方向リスト(fnFIE_dlist_ プレフィックスの関数)

[↑戻る]


NULL について:

このリファレンス内で NULL と表記されているものは、 System.IntPtr.Zero を意味します。 従って、"NULL で初期化する"とは、"System.IntPtr.Zero で初期化する"ことになります。

また、後述のポインタ走査用構造体(_PTR サフィックスが付加された構造体)には、 それぞれ無効なアドレスを示す定数 Zero (例. DOUBLE_PTR.Zero)が定義されており、 これは System.IntPtr.Zero と等価です。

[↑戻る]


ポインタ走査用構造体について:

このライブラリの特徴の1つとして『ポインタ走査用構造体』(※)というものがあります。
_PTR サフィックスが付加された構造体です。

これは、C言語のポインタを .NET 側で保有及び走査するための構造体で、 System.IntPtr と同じ働きを持っています。 System.IntPtr と異なる点は、『型が明確である』と言うことです。

一般的な .NET アプリケーションは System.IntPtr を各型のポインタにキャストして走査しますが、 このポインタ走査用構造体は型が明確なのでキャストの必要がありません。 また、Visual Basic のようにポインタ走査ができない言語でも、 この『ポインタ走査用構造体』を使用することにより容易にポインタ走査を行うことができるようになります。

各ポインタ走査用構造体は、領域の確保・解放を行うために alloc や Dispose を持っています。 ポインタ走査を行う場合は、通常の配列のようにインデクサ([])を使用するかインクリメント(+=1)します。 下記サンプルコード中の 3) はインデクサを使用した例を示します。 4) はインクリメントを使用した例を示します。 ポインタをインクリメントして値を取り出す際は、インデクサで 0 番目を指定することに注意してください。

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;

namespace User.SampleCode.FIE
{
    public class fvalgcli7
    {
        /// <summary>
        /// 疑似ポインタ
        /// </summary>
        public void Direction()
        {
            // ==================================================
            // 1) オブジェクトの宣言.

            PNT_T_PTR points = PNT_T_PTR.Zero;
            int length = 10;

            try
            {
                // ==================================================
                // 2) 確保.

                points = PNT_T_PTR.alloc(length);

                // ==================================================
                // 3) 走査.

                for (int i = 0; i < length; i++)
                {
                    PNT_T point = points[i];
                }
            }
            finally
            {
                // ==================================================
                // E) オブジェクトの解放.

                points.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli

Namespace User.SampleCode.FIE
    Public Class fvalgcli7
        ''' <summary>
        ''' 疑似ポインタ
        ''' </summary>
        Public Sub Direction()
            ' ==================================================
            ' 1) オブジェクトの宣言.

            Dim points As PNT_T_PTR = PNT_T_PTR.Zero
            Dim length As Integer = 10

            Try
                ' ==================================================
                ' 2) 確保.

                points = PNT_T_PTR.alloc(length)

                ' ==================================================
                ' 3) 走査.

                For i As Integer = 0 To length - 1
                    Dim point As PNT_T = points(i)
                Next
            Finally
                ' ==================================================
                ' E) オブジェクトの解放.

                points.Dispose()
            End Try
        End Sub
    End Class
End Namespace

[↑戻る]


単純な画像処理:

画像オブジェクトを入出力とする単純な画像処理関数の使用例を示します。

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode.FIE
{
    public class fvalgcli2
    {
        /// <summary>
        /// 単純な画像処理
        /// </summary>
        public void Direction()
        {
            // 1) オブジェクトの宣言.
            //    FHANDLE.Zero は、C言語の NULL と等価です.

            FHANDLE hsrc = FHANDLE.Zero;        // 入力画像ハンドル.
            FHANDLE hdst = FHANDLE.Zero;        // 出力画像ハンドル.
            int status = 0;

            try
            {
                // ==================================================
                // 2) 画像入力.
                //    ここでは画像ファイルを入力しています.

                status = api.fnFIE_load_img_file("./floppy_RGB.jpg", ref hsrc, f_color_img_type.F_COLOR_IMG_TYPE_UC8);

                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);

                // ==================================================
                // 3) 出力側の画像オブジェクトの確保.

                int width = api.fnFIE_img_get_width(hsrc);
                int height = api.fnFIE_img_get_height(hsrc);
                int type = api.fnFIE_img_get_type(hsrc);
                int channels = api.fnFIE_img_get_channels(hsrc);

                hdst = api.fnFIE_img_root_alloc(type, channels, width, height);

                if (hdst == FHANDLE.Zero)
                    throw new FvException(f_err.F_ERR_NOMEMORY);

                // ==================================================
                // 4) 画像処理の実行.

                status = api.fnFIE_sobel(hsrc, hdst, f_sobel_mode.F_SOBEL_XY_MODE, f_border_mode.F_BORDER_CONTINUOUS, 0);

                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);

                // ==================================================
                // -) 確認.
                SaveResult(hdst);
            }
            finally
            {
                // ==================================================
                // E) 画像オブジェクトの解放.
                //    ここでは FHANDLE 構造体の Dispose メソッドを使用して解放しています.
                //    api.fnFIE_free_object を使用しても同様に解放できます.

                hsrc.Dispose();
                hdst.Dispose();
            }
        }

        /// <summary>
        /// 処理結果の保存.
        /// </summary>
        /// <param name="hdst">処理結果画像</param>
        private void SaveResult(FHANDLE hdst)
        {
            try
            {
                // PNGファイルに保存します.
                string filename = this.GetType().ToString() + ".png";
                int status = api.fnFIE_save_png(filename, hdst, -1);
                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);
            }
            finally
            {
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Namespace User.SampleCode.FIE
    Public Class fvalgcli2
        ''' <summary>
        ''' 単純な画像処理
        ''' </summary>
        Public Sub Direction()
            ' 1) オブジェクトの宣言.
            '    FHANDLE.Zero は、C言語の NULL と等価です.

            Dim hsrc As FHANDLE = FHANDLE.Zero
            ' 入力画像ハンドル.
            Dim hdst As FHANDLE = FHANDLE.Zero
            ' 出力画像ハンドル.
            Dim status As Integer = 0

            Try
                ' ==================================================
                ' 2) 画像入力.
                '    ここでは画像ファイルを入力しています.

                status = api.fnFIE_load_img_file("./floppy_RGB.jpg", hsrc, f_color_img_type.F_COLOR_IMG_TYPE_UC8)

                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If

                ' ==================================================
                ' 3) 出力側の画像オブジェクトの確保.

                Dim width As Integer = api.fnFIE_img_get_width(hsrc)
                Dim height As Integer = api.fnFIE_img_get_height(hsrc)
                Dim type As Integer = api.fnFIE_img_get_type(hsrc)
                Dim channels As Integer = api.fnFIE_img_get_channels(hsrc)

                hdst = api.fnFIE_img_root_alloc(type, channels, width, height)

                If hdst = FHANDLE.Zero Then
                    Throw New FvException(f_err.F_ERR_NOMEMORY)
                End If

                ' ==================================================
                ' 4) 画像処理の実行.

                status = api.fnFIE_sobel(hsrc, hdst, f_sobel_mode.F_SOBEL_XY_MODE, f_border_mode.F_BORDER_CONTINUOUS, 0)

                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If

                ' ==================================================
                ' -) 確認.
                SaveResult(hdst)
            Finally
                ' ==================================================
                ' E) 画像オブジェクトの解放.
                '    ここでは FHANDLE 構造体の Dispose メソッドを使用して解放しています.
                '    api.fnFIE_free_object を使用しても同様に解放できます.

                hsrc.Dispose()
                hdst.Dispose()
            End Try
        End Sub

        ''' <summary>
        ''' 処理結果の保存.
        ''' </summary>
        ''' <param name="hdst">処理結果画像</param>
        Private Sub SaveResult(hdst As FHANDLE)
            Try
                ' PNGファイルに保存します.
                Dim filename As String = Me.[GetType]().ToString() & ".png"
                Dim status As Integer = api.fnFIE_save_png(filename, hdst, -1)
                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If
            Finally
            End Try
        End Sub
    End Class
End Namespace

関連:

[↑戻る]


配列を使用する画像処理 (その1):

画像オブジェクトを入力し、出力データを1次元配列に格納する画像処理関数の使用例を示します。
この例では、UINT 型の1次元配列の先頭アドレスを受け取る為、
UINT_PTR 構造体を使用しています。

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode.FIE
{
    public class fvalgcli3
    {
        /// <summary>
        /// 配列を使用する画像処理 (その1)
        /// </summary>
        public void Direction()
        {
            // 1) オブジェクトの宣言.

            int status = 0;
            FHANDLE himage = FHANDLE.Zero;            // 処理対象画像.
            FHANDLE hresult = FHANDLE.Zero;            // ブローブ解析結果ハンドル.
            UINT_PTR blob_numbers = UINT_PTR.Zero;    // ブローブ番号配列.(UINT*)
            uint num = 0;                            // ブローブ番号配列の要素数. 

            try
            {
                // ==================================================
                // 2) 画像入力.

                status = api.fnFIE_load_img_file("./blob_BIN.png", ref himage, f_color_img_type.F_COLOR_IMG_TYPE_UC8);

                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);

                // ==================================================
                // 3) 画像処理の実行.

                PNT_T offset = PNT_T.init(0, 0);

                // -) パラメータの初期化.(前景:白、背景:黒、8近傍)
                F_MEASURE_PARAMS param =
                    F_MEASURE_PARAMS.init(f_measure_color_mode.F_MEASURE_WHITEFG_BLACKBG, 8);

                hresult = api.fnFIE_measure_execute(himage, offset, ref param, ref status);

                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);

                // ==================================================
                // 4) 処理結果の取得.

                // -) 全ての有効ブローブを取得します.
                //    この場合、第2,第3引数の filters, fiter_num に NULL, 0 を指定して省略できます.

                status = api.fnFIE_measure_get_list(
                    hresult,
                    F_MEASURE_FILTER_RANGE_PTR.Zero, 0,
                    ref blob_numbers, ref num);

                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);

                // ==================================================
                // -) 確認.
                SaveResult(himage, hresult, blob_numbers, num);
            }
            finally
            {
                // ==================================================
                // E) オブジェクトの解放.

                himage.Dispose();
                hresult.Dispose();
                blob_numbers.Dispose();
            }
        }

        /// <summary>
        /// 処理結果の保存.
        /// </summary>
        /// <param name="himage">処理対象画像</param>
        /// <param name="hresult">ブローブ解析結果ハンドル</param>
        /// <param name="blob_numbers">ブローブ番号配列</param>
        /// <param name="num">ブローブ番号配列の要素数</param>
        private void SaveResult(FHANDLE himage, FHANDLE hresult, UINT_PTR blob_numbers, uint num)
        {
            int status = 0;
            FHANDLE htmp = FHANDLE.Zero;            // 作業用画像.
            FHANDLE hchild = FHANDLE.Zero;            // 作業用画像.(チャイルド画像)
            DOUBLE_PTR values = DOUBLE_PTR.Zero;

            try
            {
                int width = api.fnFIE_img_get_width(himage);
                int height = api.fnFIE_img_get_height(himage);
                int type = (int)f_imgtype.F_IMG_UC8;
                int channels = 3;

                htmp = api.fnFIE_img_root_alloc(type, channels, width, height);
                if (htmp == FHANDLE.Zero)
                    throw new FvException(f_err.F_ERR_NOMEMORY);

                // カラー化.
                for(int ch=0 ; ch<channels ; ch++)
                {
                    hchild = api.fnFIE_img_child_alloc_single_ch(htmp, ch, 0, 0, width, height);
                    status = api.fnFIE_img_copy_ex(himage, hchild, 1, 0, 0);
                    hchild.Dispose();
                    if (status != (int)f_err.F_ERR_NONE)
                        throw new FvException(status);
                }

                // ブローブの重心を画像に描画します.
                values = DOUBLE_PTR.alloc(channels);
                values[0] = 0xFF;    // R
                values[1] = 0x00;    // G
                values[2] = 0x00;    // B
                for (int i = 0; i < (int)num; i++)
                {
                    uint blobno = blob_numbers[i];
                    double center_x = 0;
                    double center_y = 0;
                    api.fnFIE_measure_get_center(hresult, blobno, ref center_x, ref center_y);
                    api.fnFIE_draw_circle(
                        htmp, values, f_draw_fill_mode.F_DRAW_FILL_IN, DPNT_T.init(center_x, center_y), 2);
                }

                // PNGファイルに保存します.
                string filename = this.GetType().ToString() + ".png";
                status = api.fnFIE_save_png(filename, htmp, -1);
                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);
            }
            finally
            {
                htmp.Dispose();
                values.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Namespace User.SampleCode.FIE
    Public Class fvalgcli3
        ''' <summary>
        ''' 配列を使用する画像処理 (その1)
        ''' </summary>
        Public Sub Direction()
            ' 1) オブジェクトの宣言.

            Dim status As Integer = 0
            Dim himage As FHANDLE = FHANDLE.Zero
            ' 処理対象画像.
            Dim hresult As FHANDLE = FHANDLE.Zero
            ' ブローブ解析結果ハンドル.
            Dim blob_numbers As UINT_PTR = UINT_PTR.Zero
            ' ブローブ番号配列.(UINT*)
            Dim num As UInteger = 0
            ' ブローブ番号配列の要素数. 
            Try
                ' ==================================================
                ' 2) 画像入力.

                status = api.fnFIE_load_img_file("./blob_BIN.png", himage, f_color_img_type.F_COLOR_IMG_TYPE_UC8)

                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If

                ' ==================================================
                ' 3) 画像処理の実行.

                Dim offset As PNT_T = PNT_T.init(0, 0)

                ' -) パラメータの初期化.(前景:白、背景:黒、8近傍)
                Dim param As F_MEASURE_PARAMS = F_MEASURE_PARAMS.init(f_measure_color_mode.F_MEASURE_WHITEFG_BLACKBG, 8)

                hresult = api.fnFIE_measure_execute(himage, offset, param, status)

                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If

                ' ==================================================
                ' 4) 処理結果の取得.

                ' -) 全ての有効ブローブを取得します.
                '    この場合、第2,第3引数の filters, fiter_num に NULL, 0 を指定して省略できます.

                status = api.fnFIE_measure_get_list(hresult, F_MEASURE_FILTER_RANGE_PTR.Zero, 0, blob_numbers, num)

                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If

                ' ==================================================
                ' -) 確認.
                SaveResult(himage, hresult, blob_numbers, num)
            Finally
                ' ==================================================
                ' E) オブジェクトの解放.

                himage.Dispose()
                hresult.Dispose()
                blob_numbers.Dispose()
            End Try
        End Sub

        ''' <summary>
        ''' 処理結果の保存.
        ''' </summary>
        ''' <param name="himage">処理対象画像</param>
        ''' <param name="hresult">ブローブ解析結果ハンドル</param>
        ''' <param name="blob_numbers">ブローブ番号配列</param>
        ''' <param name="num">ブローブ番号配列の要素数</param>
        Private Sub SaveResult(himage As FHANDLE, hresult As FHANDLE, blob_numbers As UINT_PTR, num As UInteger)
            Dim status As Integer = 0
            Dim htmp As FHANDLE = FHANDLE.Zero
            ' 作業用画像.
            Dim hchild As FHANDLE = FHANDLE.Zero
            ' 作業用画像.(チャイルド画像)
            Dim values As DOUBLE_PTR = DOUBLE_PTR.Zero

            Try
                Dim width As Integer = api.fnFIE_img_get_width(himage)
                Dim height As Integer = api.fnFIE_img_get_height(himage)
                Dim type As Integer = CInt(f_imgtype.F_IMG_UC8)
                Dim channels As Integer = 3

                htmp = api.fnFIE_img_root_alloc(type, channels, width, height)
                If htmp = FHANDLE.Zero Then
                    Throw New FvException(f_err.F_ERR_NOMEMORY)
                End If

                ' カラー化.
                For ch As Integer = 0 To channels - 1
                    hchild = api.fnFIE_img_child_alloc_single_ch(htmp, ch, 0, 0, width, height)
                    status = api.fnFIE_img_copy_ex(himage, hchild, 1, 0, 0)
                    hchild.Dispose()
                    If status <> CInt(f_err.F_ERR_NONE) Then
                        Throw New FvException(status)
                    End If
                Next

                ' ブローブの重心を画像に描画します.
                values = DOUBLE_PTR.alloc(channels)
                values(0) = &Hff
                ' R
                values(1) = &H0
                ' G
                values(2) = &H0
                ' B
                For i As Integer = 0 To CInt(num) - 1
                    Dim blobno As UInteger = blob_numbers(i)
                    Dim center_x As Double = 0
                    Dim center_y As Double = 0
                    api.fnFIE_measure_get_center(hresult, blobno, center_x, center_y)
                    api.fnFIE_draw_circle(htmp, values, f_draw_fill_mode.F_DRAW_FILL_IN, DPNT_T.init(center_x, center_y), 2)
                Next

                ' PNGファイルに保存します.
                Dim filename As String = Me.[GetType]().ToString() & ".png"
                status = api.fnFIE_save_png(filename, htmp, -1)
                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If
            Finally
                htmp.Dispose()
                values.Dispose()
            End Try
        End Sub
    End Class
End Namespace

関連:

[↑戻る]


配列を使用する画像処理 (その2):

画像オブジェクトを入力し、出力データを1次元配列に格納する画像処理関数の使用例を示します。
この例では、PNT_T 構造体の1次元配列の先頭アドレスを受け取る為、
PNT_T_PTR 構造体を使用しています。 また、FVIL の PNT_T_ARRAY との併用も行っています。

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode.FIE
{
    public class fvalgcli4
    {
        /// <summary>
        /// 配列を使用する画像処理 (その2)
        /// </summary>
        public void Direction()
        {
            // 1) オブジェクトの宣言.

            int status = 0;
            FVIL.Data.CFviImage src = null;
            FVIL.Blob.CFviBlobResult result = null;
            PNT_T_PTR points = PNT_T_PTR.Zero;    // PNT_T 配列.(PNT_T*)
            uint num = 0;                        // PNT_T 配列の要素数. 

            try
            {
                // ==================================================
                // 2) 画像入力.

                src = FVIL.File.Function.LoadImageFile("./blob_BIN.png");

                // ==================================================
                // 3) 画像処理の実行.

                result = new FVIL.Blob.CFviBlobResult();

                FVIL.Blob.CFviBlob parser = new FVIL.Blob.CFviBlob(src, result);
                parser.Param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG_BlackBG;
                parser.Param.Neighborhood = FVIL.Blob.Neighborhood.Eight;
                parser.Execute();

                // ==================================================
                // 4) 処理結果の取得.

                // -- 1つ目のブローブの境界点列を取得します.

                status = api.fnFIE_measure_get_boundary(result.Handle, 1, ref points, ref num);

                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);

                // ==================================================
                // -) 確認.
                //    点列のアドレス(PNT_T_PTR)を FVIL のクラス(PNT_T_ARRAY)に設定して渡します.

                SaveResult(src, new FVIL.PNT_T_ARRAY(points, (int)num, true));
            }
            finally
            {
                // ==================================================
                // E) オブジェクトの解放.

                if (src != null)
                    src.Dispose();
                if (result != null)
                    result.Dispose();
                points.Dispose();
            }
        }

        /// <summary>
        /// 処理結果の保存.
        /// </summary>
        /// <param name="src">処理対象画像</param>
        /// <param name="points">ブローブの境界点列</param>
        private void SaveResult(FVIL.Data.CFviImage src, FVIL.PNT_T_ARRAY points)
        {
            // カラー化.
            FVIL.Data.CFviImage canvas =
                new FVIL.Data.CFviImage(src.HorzSize, src.VertSize, FVIL.ImageType.UC8, 3);
            new FVIL.Conversion.CFviTrueColor(src, canvas).Execute();

            // ブローブの境界点列を画像に描画します.
            FVIL.Paint.Function.DrawPoints(canvas, points, new double[] { 255, 0, 0 });

            // 保存.
            string filename = this.GetType().ToString() + ".png";
            FVIL.File.Function.SaveImageFile(filename, canvas);

            canvas.Dispose();
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Namespace User.SampleCode.FIE
    Public Class fvalgcli4
        ''' <summary>
        ''' 配列を使用する画像処理 (その2)
        ''' </summary>
        Public Sub Direction()
            ' 1) オブジェクトの宣言.

            Dim status As Integer = 0
            Dim src As FVIL.Data.CFviImage = Nothing
            Dim result As FVIL.Blob.CFviBlobResult = Nothing
            Dim points As PNT_T_PTR = PNT_T_PTR.Zero
            ' PNT_T 配列.(PNT_T*)
            Dim num As UInteger = 0
            ' PNT_T 配列の要素数. 
            Try
                ' ==================================================
                ' 2) 画像入力.

                src = FVIL.File.[Function].LoadImageFile("./blob_BIN.png")

                ' ==================================================
                ' 3) 画像処理の実行.

                result = New FVIL.Blob.CFviBlobResult()

                Dim parser As New FVIL.Blob.CFviBlob(src, result)
                parser.Param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG_BlackBG
                parser.Param.Neighborhood = FVIL.Blob.Neighborhood.Eight
                parser.Execute()

                ' ==================================================
                ' 4) 処理結果の取得.

                ' -- 1つ目のブローブの境界点列を取得します.

                status = api.fnFIE_measure_get_boundary(result.Handle, 1, points, num)

                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If

                ' ==================================================
                ' -) 確認.
                '    点列のアドレス(PNT_T_PTR)を FVIL のクラス(PNT_T_ARRAY)に設定して渡します.

                SaveResult(src, New FVIL.PNT_T_ARRAY(points, CInt(num), True))
            Finally
                ' ==================================================
                ' E) オブジェクトの解放.

                If src IsNot Nothing Then
                    src.Dispose()
                End If
                If result IsNot Nothing Then
                    result.Dispose()
                End If
                points.Dispose()
            End Try
        End Sub

        ''' <summary>
        ''' 処理結果の保存.
        ''' </summary>
        ''' <param name="src">処理対象画像</param>
        ''' <param name="points">ブローブの境界点列</param>
        Private Sub SaveResult(src As FVIL.Data.CFviImage, points As FVIL.PNT_T_ARRAY)
            ' カラー化.
            Dim canvas As New FVIL.Data.CFviImage(src.HorzSize, src.VertSize, FVIL.ImageType.UC8, 3)
            Dim parser = New FVIL.Conversion.CFviTrueColor(src, canvas)
            parser.Execute()

            ' ブローブの境界点列を画像に描画します.
            FVIL.Paint.[Function].DrawPoints(canvas, points, New Double() {255, 0, 0})

            ' 保存.
            Dim filename As String = Me.[GetType]().ToString() & ".png"
            FVIL.File.[Function].SaveImageFile(filename, canvas)

            canvas.Dispose()
        End Sub
    End Class
End Namespace

関連:

[↑戻る]


配列を使用する画像処理 (その3):

画像オブジェクトを入力し、出力データを1次元配列に格納する画像処理関数の使用例を示します。
この例では、F_DEDGE 構造体の1次元配列の先頭アドレスを受け取る為、
F_DEDGE_PTR 構造体を使用しています。 また、FVIL の CFviEdgeResultD64 との併用も行っています。

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode.FIE
{
    public class fvalgcli5
    {
        /// <summary>
        /// 配列を使用する画像処理 (その3)
        /// </summary>
        public void Direction()
        {
            // ==================================================
            // 1) オブジェクトの宣言.

            int status = 0;
            FVIL.Data.CFviImage src = null;
            F_DEDGE_PTR edges = F_DEDGE_PTR.Zero;
            int edge_num = 0;

            try
            {
                // ==================================================
                // 2) 画像入力.

                src = FVIL.File.Function.LoadImageFile("./disk_cd_01.png");

                // ==================================================
                // 3) 画像処理の実行.

                // -- 入力.
                FHANDLE hsrc = src.GetFIEChild();

                // -- パラメータ.
                F_ARC arc = F_ARC.init(157, 123, 24, 0, FVIL.Math.DegToRad(63));
                int prj_width = 0;
                f_edge1d_filter filter_mode = f_edge1d_filter.F_EDGE1D_CORR;
                f_edge1d_edge_direction direct_mode = f_edge1d_edge_direction.F_DTC_BOTH;
                f_diff_type diff_type = f_diff_type.F_ABSOLUTE_THR;
                double diff_thr = 25;
                f_edge1d_sort_mode sort_mode = f_edge1d_sort_mode.F_POS_SORT; 

                // -- 実行.
                status = api.fnFIE_edge1d_arc(
                    hsrc, arc, prj_width, filter_mode, direct_mode, diff_type, diff_thr, sort_mode,
                    ref edges, ref edge_num);

                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);

                // ==================================================
                // -) 確認.
                //    エッジ点列のアドレス(F_DEDGE_PTR)を FVIL のクラス(CFviEdgeResultD64)に設定して渡します.

                SaveResult(src, new FVIL.Edge.CFviEdgeResultD64(edges, edge_num, true));
            }
            finally
            {
                // ==================================================
                // E) オブジェクトの解放.

                if (src != null)
                    src.Dispose();
                edges.Dispose();
            }
        }

        /// <summary>
        /// 処理結果の保存.
        /// </summary>
        /// <param name="src">処理対象画像</param>
        /// <param name="result">エッジ検出結果</param>
        private void SaveResult(FVIL.Data.CFviImage src, FVIL.Edge.CFviEdgeResultD64 result)
        {
            // カラー化.
            FVIL.Data.CFviImage canvas =
                new FVIL.Data.CFviImage(src.HorzSize, src.VertSize, FVIL.ImageType.UC8, 3);
            new FVIL.Conversion.CFviTrueColor(src, canvas).Execute();

            // 描画.
            FVIL.Paint.Function.DrawPoints(canvas, result, new double[] {255, 0, 0});
            for (int i = 0; i < result.Count; i++)
            {
                FVIL.Paint.Function.DrawCircle(
                        canvas,
                        new FVIL.Data.CFviCircle(result[i].x, result[i].y, 5),
                        new double[] { 255, 0, 0 },
                        FVIL.Paint.FillMode.Line
                    );
            }

            // 保存.
            string filename = this.GetType().ToString() + ".png";
            FVIL.File.Function.SaveImageFile(filename, canvas);

            canvas.Dispose();
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Namespace User.SampleCode.FIE
    Public Class fvalgcli5
        ''' <summary>
        ''' 配列を使用する画像処理 (その3)
        ''' </summary>
        Public Sub Direction()
            ' ==================================================
            ' 1) オブジェクトの宣言.

            Dim status As Integer = 0
            Dim src As FVIL.Data.CFviImage = Nothing
            Dim edges As F_DEDGE_PTR = F_DEDGE_PTR.Zero
            Dim edge_num As Integer = 0

            Try
                ' ==================================================
                ' 2) 画像入力.

                src = FVIL.File.[Function].LoadImageFile("./disk_cd_01.png")

                ' ==================================================
                ' 3) 画像処理の実行.

                ' -- 入力.
                Dim hsrc As FHANDLE = src.GetFIEChild()

                ' -- パラメータ.
                Dim arc As F_ARC = F_ARC.init(157, 123, 24, 0, FVIL.Math.DegToRad(63))
                Dim prj_width As Integer = 0
                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_DTC_BOTH
                Dim diff_type As f_diff_type = f_diff_type.F_ABSOLUTE_THR
                Dim diff_thr As Double = 25
                Dim sort_mode As f_edge1d_sort_mode = f_edge1d_sort_mode.F_POS_SORT

                ' -- 実行.
                status = api.fnFIE_edge1d_arc(hsrc, arc, prj_width, filter_mode, direct_mode, diff_type, _
                    diff_thr, sort_mode, edges, edge_num)

                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If

                ' ==================================================
                ' -) 確認.
                '    エッジ点列のアドレス(F_DEDGE_PTR)を FVIL のクラス(CFviEdgeResultD64)に設定して渡します.

                SaveResult(src, New FVIL.Edge.CFviEdgeResultD64(edges, edge_num, True))
            Finally
                ' ==================================================
                ' E) オブジェクトの解放.

                If src IsNot Nothing Then
                    src.Dispose()
                End If
                edges.Dispose()
            End Try
        End Sub

        ''' <summary>
        ''' 処理結果の保存.
        ''' </summary>
        ''' <param name="src">処理対象画像</param>
        ''' <param name="result">エッジ検出結果</param>
        Private Sub SaveResult(src As FVIL.Data.CFviImage, result As FVIL.Edge.CFviEdgeResultD64)
            ' カラー化.
            Dim canvas As New FVIL.Data.CFviImage(src.HorzSize, src.VertSize, FVIL.ImageType.UC8, 3)
            Dim parser = New FVIL.Conversion.CFviTrueColor(src, canvas)
            parser.Execute()

            ' 描画.
            FVIL.Paint.[Function].DrawPoints(canvas, result, New Double() {255, 0, 0})
            For i As Integer = 0 To result.Count - 1
                FVIL.Paint.[Function].DrawCircle(canvas, New FVIL.Data.CFviCircle(result(i).x, result(i).y, 5), New Double() {255, 0, 0}, FVIL.Paint.FillMode.Line)
            Next

            ' 保存.
            Dim filename As String = Me.[GetType]().ToString() & ".png"
            FVIL.File.[Function].SaveImageFile(filename, canvas)

            canvas.Dispose()
        End Sub
    End Class
End Namespace

関連:

[↑戻る]


配列を使用する画像処理 (その4):

1次元配列を入力とする画像処理関数の使用例を示します。
この例では、RGBQUAD 構造体の1次元配列の先頭アドレスを渡す為、
RGBQUAD_PTR 構造体を使用しています。 また、FVIL の CFviImage との併用も行っています。

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;

namespace User.SampleCode.FIE
{
    public class fvalgcli6
    {
        /// <summary>
        /// 配列を使用する画像処理 (その4)
        /// </summary>
        public void Direction()
        {
            // ==================================================
            // 1) オブジェクトの宣言.

            int status = 0;
            FVIL.Data.CFviImage src = null;
            FVIL.Data.CFviImage dst = null;

            try
            {
                // ==================================================
                // 2) 画像生成.

                src = new FVIL.Data.CFviImage(256, 1, FVIL.ImageType.RGB32, 1);
                dst = new FVIL.Data.CFviImage(256, 25, FVIL.ImageType.UC8, 3);

                // ==================================================
                // 3) 画像処理の実行.

                RGBQUAD_PTR rgb = src.GetImageAdrs(0, 0, 0);

                status = api.fnFIE_make_pseudo_colormap(
                    rgb, src.HorzSize, f_colormap_type.F_COLORMAP_RAINBOW_CYCLIC, 255);

                if (status != (int)f_err.F_ERR_NONE)
                    throw new FvException(status);

                // ==================================================
                // 4) 処理結果(1次元配列)を2次元の画像に変換.

                for (int y = 0; y < dst.VertSize; y++)
                {
                    dst.Window = new Rectangle(0, y, src.HorzSize, src.VertSize);
                    new FVIL.Conversion.CFviTrueColor(src, dst).Execute();
                }

                // ==================================================
                // -) 確認.
                string filename = this.GetType().ToString() + ".png";
                FVIL.File.Function.SaveImageFile(filename, dst);
            }
            finally
            {
                // ==================================================
                // E) オブジェクトの解放.

                if (src != null) src.Dispose();
                if (dst != null) dst.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli

Namespace User.SampleCode.FIE
    Public Class fvalgcli6
        ''' <summary>
        ''' 配列を使用する画像処理 (その4)
        ''' </summary>
        Public Sub Direction()
            ' ==================================================
            ' 1) オブジェクトの宣言.

            Dim status As Integer = 0
            Dim src As FVIL.Data.CFviImage = Nothing
            Dim dst As FVIL.Data.CFviImage = Nothing

            Try
                ' ==================================================
                ' 2) 画像生成.

                src = New FVIL.Data.CFviImage(256, 1, FVIL.ImageType.RGB32, 1)
                dst = New FVIL.Data.CFviImage(256, 25, FVIL.ImageType.UC8, 3)

                ' ==================================================
                ' 3) 画像処理の実行.

                Dim rgb As RGBQUAD_PTR = src.GetImageAdrs(0, 0, 0)

                status = api.fnFIE_make_pseudo_colormap(rgb, src.HorzSize, f_colormap_type.F_COLORMAP_RAINBOW_CYCLIC, 255)

                If status <> CInt(f_err.F_ERR_NONE) Then
                    Throw New FvException(status)
                End If

                ' ==================================================
                ' 4) 処理結果(1次元配列)を2次元の画像に変換.

                For y As Integer = 0 To dst.VertSize - 1
                    dst.Window = New Rectangle(0, y, src.HorzSize, src.VertSize)
                    Dim parser = New FVIL.Conversion.CFviTrueColor(src, dst)
                    parser.Execute()
                Next

                ' ==================================================
                ' -) 確認.
                Dim filename As String = Me.[GetType]().ToString() & ".png"
                FVIL.File.[Function].SaveImageFile(filename, dst)
            Finally
                ' ==================================================
                ' E) オブジェクトの解放.

                If src IsNot Nothing Then
                    src.Dispose()
                End If
                If dst IsNot Nothing Then
                    dst.Dispose()
                End If
            End Try
        End Sub
    End Class
End Namespace

関連:

[↑戻る]

Inheritance Hierarchy

System..::..Object
fvalgcli..::..api

See Also