カメラキャリブレーションデータオブジェクトの作成2

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

Syntax

C#
public static FHANDLE fnFIE_calib_open2(
	int type,
	int n,
	double unit,
	DPNT_T offset,
	ref int status
)
Visual Basic
Public Shared Function fnFIE_calib_open2 ( 
	type As Integer,
	n As Integer,
	unit As Double,
	offset As DPNT_T,
	ByRef status As Integer
) As FHANDLE

Parameters

type
Type: System..::..Int32
モデルの種別 (下記の値を指定してください。)
  • F_CALIB_MODEL_CIRCLE
n
Type: System..::..Int32
円の縦横方向個数
  • type が F_CALIB_MODEL_CIRCLE の場合、 n > 2
unit
Type: System..::..Double
モデルの単位長さ。ワールド座標系の単位(ミリメートル等)で与えます。 ( unit > 0.0 )
offset
Type: fvalgcli..::..DPNT_T
モデル原点とワールド座標系原点のオフセット。ワールド座標系の単位(ミリメートル等)で与えます。
status
Type: System..::..Int32%
エラーコード。不要な場合は IntPtr.Zero を指定してください。
  • F_ERR_NONE 正常終了
  • F_ERR_NOMEMORY メモリ不足
  • F_ERR_INVALID_PARAM パラメータ異常

Return Value

Type: FHANDLE
f_err内容
IntPtr.Zero異常終了
IntPtr.Zero 以外カメラキャリブレーションデータオブジェクト
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

Remarks

Examples

C# Copy imageCopy
//    $Revision: 1.1 $
//#define ONESHOT
#define PARAMSCALE
#define MAPSCALE

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

namespace TC
{
    public partial class FIE
    {
        /// <summary>
        /// カメラキャリブレーションデータオブジェクトの作成2.
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_calib_open2()
        {
            int status = (int)f_err.F_ERR_NONE;

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

            FHANDLE hdst = FHANDLE.Zero;                                // 歪み補正画像.

            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);

                // 特徴点の検出とハンドルへの追加(detectとaddをまとめた関数).
                fnFIE_calib_add_data2(hcalib);

                // カメラ内部パラメータの算出.
                F_CAMERA_PARAM pcamera;                // カメラ内部パラメータ構造体.
#if ONESHOT
                // 1視野のみの画像を用いた特殊なキャリブレーション.
                pcamera = fnFIE_calib_calc_1shot(hcalib);
#else
                // 通常のキャリブレーション.
                pcamera = fnFIE_calib_calc_intrinsic_parameters(hcalib);
#endif
                // 歪み補正画像の生成.
                hdst = CreateUndistortImage(pcamera);

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

        /// <summary>
        /// 歪み補正画像の生成.
        /// </summary>
        /// <param name="pcamera"></param>
        public FHANDLE CreateUndistortImage(F_CAMERA_PARAM pcamera)
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE hsrc = FHANDLE.Zero;    // 歪み補正対象画像.
            FHANDLE hdst = FHANDLE.Zero;    // 歪み補正画像.
            FHANDLE hmap = FHANDLE.Zero;    // 歪み補正マップ.

            double scale = 0;                    // 歪み補正マップのスケール.
            DPNT_T offset = DPNT_T.init(0, 0);    // 歪み補正マップのオフセット.
            int fit_width = 0;                    // 歪み補正マップの幅(歪み補正画像の幅).
            int fit_height = 0;                    // 歪み補正マップの高さ(歪み補正画像の高さ).

            try
            {
                // 歪み補正対象画像のロード.
                status = api.fnFIE_load_img_file(TestImageDir + "/testdata/calib_target.bmp", ref hsrc, f_color_img_type.F_COLOR_IMG_TYPE_UC8);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 歪み補正マップのパラメータ算出.
#if MAPSCALE
#if PARAMSCALE
                // パラメータ算出1.
                fnFIE_calib_undistort_fit_scale(pcamera, hsrc, ref scale, ref offset, ref fit_width, ref fit_height);
#else
                // パラメータ算出2.
                fnFIE_calib_undistort_fit_rect(pcamera, hsrc, ref scale, ref offset, ref fit_width, ref fit_height);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);
#endif
                // 歪み補正マップの生成.
                hmap = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_DOUBLE, 2, fit_width, fit_height);
                fnFIE_calib_undistort_image_map_scale(hmap, pcamera, scale, offset);
#else
                fit_width = api.fnFIE_img_get_width(hsrc);
                fit_height = api.fnFIE_img_get_height(hsrc);
                hmap = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_DOUBLE, 2, fit_width, fit_height);
                fnFIE_calib_undistort_image_map(hmap, pcamera);
#endif
                // 歪み補正画像の生成.
                int type = api.fnFIE_img_get_type(hsrc);
                int ch = api.fnFIE_img_get_channels(hsrc);
                hdst = api.fnFIE_img_root_alloc(type, ch, fit_width, fit_height);
                status = api.fnFIE_geotrans_warpping(hsrc, hmap, hdst, FHANDLE.Zero, false, f_sampling_mode.F_SAMPLING_BILINEAR);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                return hdst;
            }
            finally
            {
                hsrc.Dispose();
                hmap.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $
'#Const ONESHOT = True
#Const PARAMSCALE = True
#Const MAPSCALE = True

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

Public Partial Class FIE
    ''' <summary>
    ''' カメラキャリブレーションデータオブジェクトの作成2.
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_calib_open2()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        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 = 4
        ' モデルの単位長さ.ワールド座標系の単位(ミリメートル等)で与えます.
        Dim offset As DPNT_T = DPNT_T.init(0, 0)
        ' モデル原点とワールド座標系原点のオフセット.ワールド座標系の単位(ミリメートル等)で与えます.
        Dim hdst As FHANDLE = FHANDLE.Zero
        ' 歪み補正画像.
        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))

            ' 特徴点の検出とハンドルへの追加(detectとaddをまとめた関数).
            fnFIE_calib_add_data2(hcalib)

            ' カメラ内部パラメータの算出.
            Dim pcamera As F_CAMERA_PARAM
            ' カメラ内部パラメータ構造体.
            #If ONESHOT Then
            ' 1視野のみの画像を用いた特殊なキャリブレーション.
            pcamera = fnFIE_calib_calc_1shot(hcalib)
            #Else
            ' 通常のキャリブレーション.
            pcamera = fnFIE_calib_calc_intrinsic_parameters(hcalib)
            #End If
            ' 歪み補正画像の生成.
            hdst = CreateUndistortImage(pcamera)

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

    ''' <summary>
    ''' 歪み補正画像の生成.
    ''' </summary>
    ''' <param name="pcamera"></param>
    Public Function CreateUndistortImage(pcamera As F_CAMERA_PARAM) As FHANDLE
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim hsrc As FHANDLE = FHANDLE.Zero
        ' 歪み補正対象画像.
        Dim hdst As FHANDLE = FHANDLE.Zero
        ' 歪み補正画像.
        Dim hmap As FHANDLE = FHANDLE.Zero
        ' 歪み補正マップ.
        Dim scale As Double = 0
        ' 歪み補正マップのスケール.
        Dim offset As DPNT_T = DPNT_T.init(0, 0)
        ' 歪み補正マップのオフセット.
        Dim fit_width As Integer = 0
        ' 歪み補正マップの幅(歪み補正画像の幅).
        Dim fit_height As Integer = 0
        ' 歪み補正マップの高さ(歪み補正画像の高さ).
        Try
            ' 歪み補正対象画像のロード.
            status = api.fnFIE_load_img_file(TestImageDir & "/testdata/calib_target.bmp", hsrc, f_color_img_type.F_COLOR_IMG_TYPE_UC8)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 歪み補正マップのパラメータ算出.
            #If MAPSCALE Then
            #If PARAMSCALE Then
            ' パラメータ算出1.
            fnFIE_calib_undistort_fit_scale(pcamera, hsrc, scale, offset, fit_width, fit_height)
            #Else
            ' パラメータ算出2.
            fnFIE_calib_undistort_fit_rect(pcamera, hsrc, scale, offset, fit_width, fit_height)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))
            #End If
            ' 歪み補正マップの生成.
            hmap = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_DOUBLE), 2, fit_width, fit_height)
            fnFIE_calib_undistort_image_map_scale(hmap, pcamera, scale, offset)
            #Else
            fit_width = api.fnFIE_img_get_width(hsrc)
            fit_height = api.fnFIE_img_get_height(hsrc)
            hmap = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_DOUBLE), 2, fit_width, fit_height)
            fnFIE_calib_undistort_image_map(hmap, pcamera)
            #End If
            ' 歪み補正画像の生成.
            Dim type As Integer = api.fnFIE_img_get_type(hsrc)
            Dim ch As Integer = api.fnFIE_img_get_channels(hsrc)
            hdst = api.fnFIE_img_root_alloc(type, ch, fit_width, fit_height)
            status = api.fnFIE_geotrans_warpping(hsrc, hmap, hdst, FHANDLE.Zero, False, f_sampling_mode.F_SAMPLING_BILINEAR)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            Return hdst
        Finally
            hsrc.Dispose()
            hmap.Dispose()
        End Try
    End Function
End Class

See Also