キャリブレーションテンプレートの利用
[カメラキャリブレーション]

キャリブレーションテンプレートを用いた座標列の取得とその利用
キャリブレーションテンプレート
当ライブラリでは以下のような形状のキャリブレーションテンプレートを用います。
calib_templates_sample.png

キャリブレーションテンプレートの例

黒枠によって周囲の環境から切り離した白い正方形の中に等間隔で円を配置し、座標系の方向を特定するため円を一つ抜いた形状です。 各々の円の中心を特徴点として基準モデル座標列に対応します。
円モデルのキャリブレーションテンプレートのサイズは以下のようにします。
circle_model.png

円モデルのキャリブレーションテンプレート

図の数値は長さの比を表現しており、キャリブレーションテンプレートの実物を製作する際には適切な長さにして作成します。 キャリブレーションテンプレートの原点は白い正方形領域の中心です。正方形領域の中心で差し支えがある場合はオフセットを指定して別の場所に設定することができます。
circle_model_offset.png

原点の移動

キャリブレーションテンプレートの作成
平滑な板にパターンを描画して用います。精密に平滑であることと、パターンの描画精度が高いことがよりよいカメラキャリブレーションの為に重要です。 入手しやすく平滑な面の例としてはガラス板があります。
キャリブレーションテンプレートを用いたカメラキャリブレーションの流れ
  • カメラ内部パラメータの算出
    • キャリブレーションテンプレートを撮像します。
    • fnFIE_calib_open2() でキャリブレーションテンプレートの形状とサイズ、原点位置を与え、キャリブレーションデータオブジェクトを作成します。
    • fnFIE_calib_add_data2() に撮像した画像を与え、キャリブレーションデータオブジェクトに座標点列を追加します。撮像した枚数だけ繰り返します。
    • fnFIE_calib_calc_intrinsic_parameters() でカメラ内部パラメータを算出します。
  • カメラ外部パラメータの算出
    • ワールド座標系原点を設定します。(キャリブレーションテンプレートを原点位置に設置)
    • キャリブレーションテンプレートを撮像します。
    • fnFIE_calib_detect() で撮像したキャリブレーションテンプレートの画像から特徴点の座標を検出します。
    • fnFIE_calib_undistort_points() で特徴点の座標を理想画像座標系に変換します。
    • fnFIE_calib_get_model_points() でキャリブレーションデータオブジェクトから基準モデル座標列を取得します。
    • fnFIE_calib_calc_extrinsic_parameters() でカメラ外部パラメータを算出します。
カメラ内部パラメータ算出のためのキャリブレーションテンプレートの撮像について
簡易的には、5枚を視野の中央付近で正面、上下、左右にキャリブレーションテンプレートを傾けて撮像して下さい。
grab_template1.png

推奨するキャリブレーションテンプレートの動かし方

キャリブレーションテンプレートが固定されていたり巨大だったりして姿勢を動かしにくい場合、カメラ側を動かして撮像します。 カメラ内部パラメータの算出のためにはレンズとカメラの組み合わせだけが固定されていれば良いため、撮像するカメラの位置は自由にできます。
grab_template2.png

カメラ側を動かす例

最初の5枚の後は、視野の周辺部分で中央同様に姿勢を動かしたり撮像済みの姿勢でも特徴点の間隔の半分だけ動かしたり角度を変えたりと、特徴点が占めなかった場所を埋めるように動かして行きます。
grab_template3.png

視野周辺データを追加していく

より良いカメラ内部パラメータの算出のためには
  • 撮像枚数を増やします。増えれば増えるほどカメラ内部パラメータの算出時間は多くなりますが、より良いカメラ内部パラメータを得られる可能性があります。場合により10から30枚程度を利用するのがよいでしょう。
  • 各画像に写すキャリブレーションテンプレートが相互に異なった位置・姿勢になるよう調整します。ほぼ同一な画像を複数追加しても計算時間が増大するのみで算出結果は改善されません。
  • 視野を埋めるようにキャリブレーションテンプレートを動かします。画像の視野全域にわたって特徴点が検出された方が良いパラメータになります。視野の一部分のみでキャリブレーションテンプレートを撮像していると、キャリブレーションテンプレートを写さなかった部分の視野では実態に合わないカメラ内部パラメータを算出してしまうことがあります。
カメラ外部パラメータ算出のためのキャリブレーションテンプレートの撮像について
カメラ外部パラメータ算出のためにキャリブレーションテンプレートを撮像することは、視野の中でワールド座標系原点を設定する意味があります。 そのため、カメラの設置位置をしっかりと決めて動かさないようにし、撮像対象に対して視野を固定します。 視野の中でワールド座標系の原点にしたい位置へ fnFIE_calib_open2() の実行時に設定したキャリブレーションテンプレート上の原点位置を合わせるようにキャリブレーションテンプレートを設置し、 ワールド座標系のx軸y軸にしたい方向へキャリブレーションテンプレートの辺が向くように、また円の一つ抜けている角がx軸とy軸の正となる象限になるようにします。
set_world_coodinate.png

外部パラメータ算出のためのテンプレート撮像

その他の注意点
  • 同じキャリブレーションテンプレート画像を何枚追加してもカメラ内部パラメータは良くなりません。
  • キャリブレーションテンプレートの撮像結果がボケていると特徴点の検出に差し支えます。キャリブレーションテンプレートは3次元的に動かすため、テンプレートの近い側と遠い側ではカメラからの距離が大きく違う場合がありますが、そのような場合にボケが発生しないよう、レンズを適切に調整してください。
  • キャリブレーションテンプレートの白い部分の輝度がなるべく飽和しないようにしてください。特徴点の検出に悪影響が出る場合があります。
  • 画像が放射歪みを起こしている前提で歪みモデルの当てはめを行うため、テレセントリックレンズや焦点距離が長くて歪みの少ないレンズなどでは光軸中心の推定がうまくいかず、良いカメラ内部パラメータを得ることができません。
  • 画像が放射歪みを起こしている前提で歪みモデルの当てはめを行うため、ラインセンサでは画像の送り方向でモデルが適合しません。良いカメラ内部パラメータを得られません。
キャリブレーションテンプレートの利用例
例:キャリブレーションテンプレートを用いたカメラの歪み補正
  • キャリブレーションテンプレートを用意します。
  • 様々な方向からキャリブレーションテンプレートを撮像します。
    grab_template1.png
  • fnFIE_calib_open2() でキャリブレーションテンプレートの形状とサイズ、原点位置を与え、キャリブレーションデータオブジェクトを作成します。 上図の場合の条件は type = F_CALIB_MODEL_CIRCLE, n = 7, unit = 7.5mmでした。また今回 offsetはゼロとします。
  • fnFIE_calib_add_data2() に撮像した画像を与え、キャリブレーションデータオブジェクトに座標点列を追加します。上図は5枚なので5回実行します。
  • fnFIE_calib_calc_intrinsic_parameters() でカメラ内部パラメータを算出します。
  • 歪み補正の仕方を選び、座標変換マップを作成します。
    • 今回は変換元画像の全てのピクセルが変換先に現れることを目的に fnFIE_calib_undistort_fit_rect() を使用し mode = 1 を選択します。
    • 得られた画像縦横サイズを元に、座標変換マップと出力先画像の画像オブジェクトを用意します。
    • fnFIE_calib_undistort_image_map_scale() で座標変換マップを作成します。
  • 撮像し、 fnFIE_geotrans_warpping() を実行して歪み補正を行います。
    sample_undistort1.png

    歪み補正画像1

    この段階では視野中にキャリブレーションテンプレートは必要ありません。処理例のわかりやすさのためにキャリブレーションテンプレートを撮像対象にしています。 中央付近のみにキャリブレーションテンプレートを置いてカメラ内部パラメータを算出したため、画像の周辺ではまだ歪みが大きく残っています。 このような場合、歪みの残っているところでキャリブレーションテンプレートを撮像します。
    grab_template3.png

    視野周辺データを追加していく

    新しい4枚の画像を新たに追加、カメラ内部パラメータを再計算し、歪み補正を行うと次のようになります。画像の周辺まで放射歪みが改善されています。
    sample_undistort2.png

    歪み補正画像2

例:キャリブレーションテンプレートを用いた1shot キャリブレーションによるカメラの歪み補正
  • キャリブレーションテンプレートを撮像します。キャリブレーションテンプレートは極力大きく写し、なるべく正面から撮像します。
    sample_grab_1shot.png
  • fnFIE_calib_add_data2() に撮像した画像を与えます。
  • fnFIE_calib_calc_1shot() でカメラ内部パラメータを求めます。
  • 通常のカメラ内部パラメータ算出で求めた場合と同様の歪み補正を行います。
    sample_undistort_1shot.png

    1shot 歪み補正画像

例:キャリブレーションテンプレートを用いた正対変換
  • あらかじめカメラ内部パラメータを算出しておきます。
  • データを準備します。
    • 正対変換を行いたい領域を決めます。
      sample_rectify1.png

      対象にする領域

    • 対象にする領域と同一平面上にキャリブレーションテンプレートを設置することで、ワールド座標系の原点とx軸y軸の方向を決めます。
    • キャリブレーションテンプレートの原点から対象の領域へのオフセットを実際に計測しておきます。
    • キャリブレーションテンプレートを撮像します。
      sample_rectify2.png

      設置したキャリブレーションテンプレート

  • カメラ混合パラメータを算出します。
  • 画像の正対変換を行います。
    • 正対変換したい領域の実寸と、実寸の単位長さに何ピクセル割り当てるかを表す解像度を決め、出力先の画像サイズを求めます。
    • 座標変換マップと出力先画像の画像オブジェクトを用意します。
    • fnFIE_calib_rectify_ud_image_map() にカメラ内部パラメータ、カメラ混合パラメータ、計測したオフセット、解像度を与え、座標変換マップを作成します。
    • 撮像します。キャリブレーションテンプレートは取り除いてかまいません。
    • fnFIE_geotrans_warpping() を実行して正対変換を行います。
      sample_rectify3.png

      正対変換結果

例:キャリブレーションテンプレートを用いた距離の測定
  • カメラ内部パラメータとカメラ混合パラメータを算出しておきます。
  • 撮像した画像で測定したい2点の座標を決めます。
  • fnFIE_calib_undistort_points() で2点の座標を理想画像座標系に変換します。
  • fnFIE_mat_inverse() 等を用いてカメラ混合パラメータの逆行列を計算します。
  • fnFIE_geotrans_perspective_npoints() で2点の座標をワールド座標系へ変換します。
  • ワールド座標系での距離を計算します。


Documentation copyright © 2009-2024 FAST Corporation.
Generated on Fri Aug 9 16:38:48 2024 for FIEライブラリ by doxygen 1.5.6-FASTSP-p2