特徴点の検出
Namespace: fvalgcliAssembly: 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 | オブジェクト異常
|
F_ERR_NOMEMORY | メモリ不足エラー |
F_ERR_INVALID_PARAM | パラメータ異常
|
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Remarks
Examples
C# | Copy |
---|---|
// $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 |
---|---|
' $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 |