特徴点の検出

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

Syntax

C#
public static int fnFIE_calib_detect(
	FHANDLE hcalib,
	FHANDLE image,
	ref DPNT_T_PTR points,
	ref int num_points
)
Visual Basic
Public Shared Function fnFIE_calib_detect ( 
	hcalib As FHANDLE,
	image As FHANDLE,
	ByRef points As DPNT_T_PTR,
	ByRef num_points As Integer
) As Integer

Parameters

hcalib
Type: fvalgcli..::..FHANDLE
カメラキャリブレーションデータオブジェクト
image
Type: fvalgcli..::..FHANDLE
入力画像 ( type:uc8 / ch:1,3, type:rgbq,s16,us16 / ch:1 )
points
Type: fvalgcli..::..DPNT_T_PTR%
検出したモデル座標列。 IntPtr.Zero で初期化してください。不要になった場合は fnOAL_free() で解放してください。
num_points
Type: System..::..Int32%
points のサイズ

Return Value

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

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_INVALID_IMAGE画像オブジェクトの異常
F_ERR_CALC_IMPOSSIBLE計算不能
  • 発見できなかった特徴点がひとつ以上あった
  • キャリブレーションテンプレート四隅の姿勢推定に失敗した
  • 特徴点座標検出の過程で円周辺のエッジが充分に取得できなかった
  • 特徴点座標検出の過程で円の中心推定に失敗した
F_ERR_INVALID_OBJECTオブジェクト異常
  • hcalib が IntPtr.Zero
  • hcalib のオブジェクト種別が異なる
  • hcalib に設定されているモデル種別では検出ができない
F_ERR_NOMEMORYメモリ不足エラー
F_ERR_INVALID_PARAMパラメータ異常
  • points が IntPtr.Zero でない
  • num_points が IntPtr.Zero
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Remarks

Examples

C# Copy imageCopy
//    $Revision: 1.1 $

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

namespace TC
{
    public partial class FIE
    {
        /// <summary>
        /// 特徴点の検出.
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_calib_detect()
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE himg = FHANDLE.Zero;            // 特徴点検出対象画像.
            FHANDLE hdst = FHANDLE.Zero;            // 結果画像.
            DPNT_T_PTR points = DPNT_T_PTR.Zero;    // 検出点.
            int num_points = 0;                        // 検出点数.

            // ハンドルのオープン用.
            FHANDLE hcalib = FHANDLE.Zero;                                // キャリブレーションハンドル.
            int type = (int)fie_calib_model_type.F_CALIB_MODEL_CIRCLE;    // 円マーカ.
            int n = 8;                                                    // 縦、横の円の数.
            double unit = 1;                                            // モデルの単位長さ。ワールド座標系の単位(ミリメートル等)で与えます.
            DPNT_T offset = DPNT_T.init(0, 0);                            // モデル原点とワールド座標系原点のオフセット.ワールド座標系の単位(ミリメートル等)で与えます.

            try
            {
                // キャリブレーションオブジェクトの生成.
                hcalib = api.fnFIE_calib_open2(type, n, unit, offset, ref status);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 画像のロード.
                status = api.fnFIE_load_img_file(TestImageDir + "/testdata/calib_src0.bmp", ref himg, f_color_img_type.F_COLOR_IMG_TYPE_UC8);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 実行.
                status = api.fnFIE_calib_detect(hcalib, himg, ref points, ref num_points);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // ハンドルへ特徴点を追加(fnFIE_calib_add_data2では検出と追加を同時に実行できる).
                fnFIE_calib_add_data(hcalib, points, num_points);

                // 検出点の描画.
                DrawImage(himg, ref hdst, points, num_points);

                // 結果画像の保存.
                status = api.fnFIE_save_bmp(ResultDir + "/fnFIE_calib_detect.bmp", hdst);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);
            }
            finally
            {
                hcalib.Dispose();
                himg.Dispose();
                hdst.Dispose();
                points.Dispose();
            }
        }

        /// <summary>
        /// 検出点を描画する.
        /// </summary>
        /// <param name="himg"></param>
        /// <param name="hdst"></param>
        /// <param name="points"></param>
        /// <param name="num_points"></param>
        public void DrawImage(FHANDLE himg, ref FHANDLE hdst, DPNT_T_PTR points, int num_points)
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE hrgb_r = FHANDLE.Zero;            // チャイルド画像R.
            FHANDLE hrgb_g = FHANDLE.Zero;            // チャイルド画像G.
            FHANDLE hrgb_b = FHANDLE.Zero;            // チャイルド画像B.
            DOUBLE_PTR val = DOUBLE_PTR.Zero;        // 描画する際の濃度値.
            int width;                                // 幅.
            int height;                                // 高さ.

            try
            {
                width = api.fnFIE_img_get_width(himg);
                height = api.fnFIE_img_get_height(himg);

                hdst = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_UC8, 3, width, height);
                hrgb_r = api.fnFIE_img_child_alloc_single_ch(hdst, 0, 0, 0, width, height);
                hrgb_g = api.fnFIE_img_child_alloc_single_ch(hdst, 1, 0, 0, width, height);
                hrgb_b = api.fnFIE_img_child_alloc_single_ch(hdst, 2, 0, 0, width, height);

                val = DOUBLE_PTR.alloc(3);

                // 読み込み画像をコピー.
                status = api.fnFIE_img_copy(himg, hrgb_r);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);
                status = api.fnFIE_img_copy(himg, hrgb_g);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);
                status = api.fnFIE_img_copy(himg, hrgb_b);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 描画用濃度値の設定.
                val[0] = 255;    // R.
                val[1] = 0;        // G.
                val[2] = 0;        // B.

                // 描画(UC8 3チャネル RGB).
                for (int i = 0; i < num_points ; i++)
                {
                    // 円で描画.
                    status = api.fnFIE_draw_circle(hdst, val, f_draw_fill_mode.F_DRAW_FILL_IN, points[i], 2);
                    Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);
                }
            }
            finally
            {
                hrgb_r.Dispose();
                hrgb_g.Dispose();
                hrgb_b.Dispose();
                val.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

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

Public Partial Class FIE
    ''' <summary>
    ''' 特徴点の検出.
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_calib_detect()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim himg As FHANDLE = FHANDLE.Zero
        ' 特徴点検出対象画像.
        Dim hdst As FHANDLE = FHANDLE.Zero
        ' 結果画像.
        Dim points As DPNT_T_PTR = DPNT_T_PTR.Zero
        ' 検出点.
        Dim num_points As Integer = 0
        ' 検出点数.
        ' ハンドルのオープン用.
        Dim hcalib As FHANDLE = FHANDLE.Zero
        ' キャリブレーションハンドル.
        Dim type As Integer = CInt(fie_calib_model_type.F_CALIB_MODEL_CIRCLE)
        ' 円マーカ.
        Dim n As Integer = 8
        ' 縦、横の円の数.
        Dim unit As Double = 1
        ' モデルの単位長さ。ワールド座標系の単位(ミリメートル等)で与えます.
        Dim offset As DPNT_T = DPNT_T.init(0, 0)
        ' モデル原点とワールド座標系原点のオフセット.ワールド座標系の単位(ミリメートル等)で与えます.
        Try
            ' キャリブレーションオブジェクトの生成.
            hcalib = api.fnFIE_calib_open2(type, n, unit, offset, status)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 画像のロード.
            status = api.fnFIE_load_img_file(TestImageDir & "/testdata/calib_src0.bmp", himg, f_color_img_type.F_COLOR_IMG_TYPE_UC8)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 実行.
            status = api.fnFIE_calib_detect(hcalib, himg, points, num_points)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' ハンドルへ特徴点を追加(fnFIE_calib_add_data2では検出と追加を同時に実行できる).
            fnFIE_calib_add_data(hcalib, points, num_points)

            ' 検出点の描画.
            DrawImage(himg, hdst, points, num_points)

            ' 結果画像の保存.
            status = api.fnFIE_save_bmp(ResultDir & "/fnFIE_calib_detect.bmp", hdst)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))
        Finally
            hcalib.Dispose()
            himg.Dispose()
            hdst.Dispose()
            points.Dispose()
        End Try
    End Sub

    ''' <summary>
    ''' 検出点を描画する.
    ''' </summary>
    ''' <param name="himg"></param>
    ''' <param name="hdst"></param>
    ''' <param name="points"></param>
    ''' <param name="num_points"></param>
    Public Sub DrawImage(himg As FHANDLE, ByRef hdst As FHANDLE, points As DPNT_T_PTR, num_points As Integer)
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim hrgb_r As FHANDLE = FHANDLE.Zero
        ' チャイルド画像R.
        Dim hrgb_g As FHANDLE = FHANDLE.Zero
        ' チャイルド画像G.
        Dim hrgb_b As FHANDLE = FHANDLE.Zero
        ' チャイルド画像B.
        Dim val As DOUBLE_PTR = DOUBLE_PTR.Zero
        ' 描画する際の濃度値.
        Dim width As Integer
        ' 幅.
        Dim height As Integer
        ' 高さ.
        Try
            width = api.fnFIE_img_get_width(himg)
            height = api.fnFIE_img_get_height(himg)

            hdst = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_UC8), 3, width, height)
            hrgb_r = api.fnFIE_img_child_alloc_single_ch(hdst, 0, 0, 0, width, height)
            hrgb_g = api.fnFIE_img_child_alloc_single_ch(hdst, 1, 0, 0, width, height)
            hrgb_b = api.fnFIE_img_child_alloc_single_ch(hdst, 2, 0, 0, width, height)

            val = DOUBLE_PTR.alloc(3)

            ' 読み込み画像をコピー.
            status = api.fnFIE_img_copy(himg, hrgb_r)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))
            status = api.fnFIE_img_copy(himg, hrgb_g)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))
            status = api.fnFIE_img_copy(himg, hrgb_b)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 描画用濃度値の設定.
            val(0) = 255
            ' R.
            val(1) = 0
            ' G.
            val(2) = 0
            ' B.
            ' 描画(UC8 3チャネル RGB).
            For i As Integer = 0 To num_points - 1
                ' 円で描画.
                status = api.fnFIE_draw_circle(hdst, val, f_draw_fill_mode.F_DRAW_FILL_IN, points(i), 2)
                Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))
            Next
        Finally
            hrgb_r.Dispose()
            hrgb_g.Dispose()
            hrgb_b.Dispose()
            val.Dispose()
        End Try
    End Sub
End Class

See Also