Ladybugカメラを使用した幾何学的ビジョン

カメラシステムの6つのセンサーによって作り出される効果的な画像のワーピングおよびスティッチングは、物理的位置の正確なキャリブレーションとセンサーの向き、およびレンズの歪みモデルによって実現されます。このキャリブレーションにより、画像データの写真測量分析も可能になります。このアプリケーションノートでは、カメラ座標系と個々のセンサー間のマッピング方法について説明します。

Ladybugカメラの座標系

各レンズには、独自の右手3D座標系があります。また、カメラ全体に関連付けられているLadybug 3D座標系もあります。これにより、すべてのLadybugカメラで合計7つの3D座標系が生まれます。また、各センサーには2Dピクセルグリッド座標系があります。

レンズ3D座標系

6つのレンズにはそれぞれ独自の3D座標系があります。

  • 原点はレンズの光学中心
  • Z軸は、センサーからシーンの方を向いています。すなわち、光軸です。
  • X軸とY軸は、そのレンズに関連付けられた画像センサーのピクセルグリッドを基準にしています。
    • Y軸は画像列に沿った方に向きます。正のY方向は、行番号の昇順方向です。これは、通常の向きの画像の視点から下を向いています。
    • X軸は画像行に沿った方に向きます。正のX方向は、列番号の昇順方向です。これは、通常方向の画像の右側を指しています。
  • この座標系は、各レンズ/センサーペアの視点から3D空間を表すために使用されます。単位はピクセルではなくメートルです。


図1:3Dセンサー座標

センサー2D座標系

各センサーには独自の2D座標系があります。

  • u軸とv軸は、修正画像空間の画像ベースの2D画像座標系で、ピクセル単位で測定されます。
  • 座標系の原点は、光軸と修正画像面の交差点にあり、センサーごとに異なります。
  • u軸は、画像センサーの行に沿って、列番号の昇順(すなわち、右)の方向を指します。
  • V軸は、列に沿って昇順の行番号の方向(すなわち、下)を指しています。


図2:2Dセンサー座標

Ladybugカメラの座標系

Ladybugカメラ座標系は、Ladybugケースの中央にあり、6つのレンズ座標系の位置によって決定されます。

  • 原点は、5つの水平カメラ原点の中心です。
  • Z軸はトップレンズ(レンズ5)(*)の光軸と平行です。
  • X軸はレンズ0(*)の光軸と平行です。
  • Y軸は、X軸とZ軸に基づく右手座標系と一致しています。
  • LD2 – LD3 – LD5からいくつかのバリエーションが場合があります。
  • (*)注 – 組立公差のため、レンズ5とレンズ0の光軸は通常完全に垂直ではありません。Ladybugカメラ座標系のX軸は、垂直になるようにわずかに調整されます。


図3:グローバル座標

レンズ座標系とLadybug座標系の関連付け

Ladybug座標系に対する各レンズ座標系の位置は、Ladybug APIから取得できます。まず、ladybuggeom.h で定義された ladybugGetCameraUnitExtrinsics()を使用して、3D 変換と Euler角度で定義された回転を取得します。

/**
* 指定したカメラ装置の6-D外因性ベクトルを取得します。
*
* 6-D外因性ベクトルは、オイラーZYX表現(Craigの
* ロボティクスの紹介ページ 45~49を参照)に従っています。外因性の順序
* コンポーネントは以下の通りです。
*
* - 要素0 - Rx - X の回転(ラジアン)
* - 要素1 - Rx - Y の回転(ラジアン)
* - 要素2 - Rx - Z の回転(ラジアン)
* - 要素3 - Tx - Xに沿った移動(メートル)
* - 要素4 - Tx - Yに沿った移動(メートル)
* - 要素5 - Tx - Zに沿った移動(メートル)
*
* 外因性とは、対応する4x4変換マトリックスを意味します。
* では、ローカルカメラ装置座標のポイントを
* Ladybug座標フレームのポイントにマッピングできるようにします。ここで、s=sin および c=cosで
* マトリックスの形式を以下に示します。
*
* 例:
* これをCraigのマトリックスにマッピングするには
* - Rz = アルファ
* - Ry = ベータ
* - Rx = ガンマ
*
* - |X'| |((cRz)(cRy)) ((cRz)(sRy)(sRx)-(sRz)(cRx)) ((cRz)(sRy)(cRx)+(sRz)(sRx)) Tx||X|
* - |Y'|=|((sRz)(cRy)) ((sRz)(sRy)(sRx)+(cRz)(cRx)) ((sRz)(sRy)(cRx)-(cRz)(sRx)) Ty||Y|
* - |Z'| |((-sRy)) ((cRy)(sRx)) ((cRy)(cRx))) Tz||Z|
* - |1 | |0 0 0 1 ||1|
*
* @param context - LadybugContextがアクセスする
* @param uiCamera - 対象のカメラインデックス
* @param ardEulerZYX - 返された6-DオイラーZYX外因性ベクトル
*
* @return A LadybugError 関数の成功を示す
*/
LADYBUGDLL_API LadybugError
ladybugGetCameraUnitExtrinsics(
LadybugContextコンテキスト、
unsigned int uiCamera、
double ardEulerZYX[6] )

関数のコメントは、提供されたオイラー角(Rx、Ry、Rz)と平行移動(Tx、Ty、Tz)を4x4変換Tに変換する方法を示していることに注意してください。標準的な同次変換定式化を使用:

ここで、は適切な座標フレーム内にある。


この同次変換が取得されると、Ladybug座標フレームのレンズ座標フレームの原点、またはLadybug座標フレームのレンズ座標フレームの軸を計算するために使用でき、その逆も同様です。

ピクセル位置の3D光線への変換

Ladybugカメラを幾何学ビジョンに使用する際の一般的なタスクは、特定の画像のピクセル位置をLadybug座標系の3D光線に解釈することです。ピクセルを抽出できるさまざまな画像空間があります。– たとえば、球形、円筒形、修正形、または未加工などです。ユーザーは、この種のアプリケーションには未加工の画像を使用することをお勧めします。未加工の画像は、再サンプリングされていない唯一の画像であるため、その結果、画像の特徴を見つけたり追跡したりする際に最高の精度を提供するはずです。

Ladybug座標系で未加工の画像のピクセル位置を3D光線に変換するには、次の手順を実行する必要があります。

1. ladybugGetCameraUnitFocalLength()を使用して、適切なカメラの焦点距離を取得します。

2. ladybugGetCameraUnitImageCenter()を使用して、カメラの画像中心を取得します。

3. ladybugGetCameraUnitExtrinsics()を使用して、カメラの6D外因性ベクトル(オイラー角と変換)を取得します。

4. ladybugRectifyPixel()を使用して、2Dピクセル位置を修正します。

5. この修正された画像位置の(u,v)ピクセル座標を検索します。

6. 修正された2Dピクセル位置をローカルカメラ座標系内の3D光線に変換します。

7. Labybug座標系でローカル3D光線を3D光線に変換します。

修正された(列、行)画像位置から(u、v)ピクセル位置を見つけるには、画像中心の情報を考慮する必要があります。

ここで、はピクセル行の位置と等しく、画像中心行位置と等しくなります。

修正された画像位置(u、v)は、標準的なピンホールカメラモデルを使用して修正された画像を解釈することによって、ローカル3D光線値に変換できます。カメラに対して取得された焦点距離と画像中心はピクセル単位であり、指定されたカメラの修正された画像に対してのみ有効であることに注意してください。修正された2Dピクセル位置からローカル3D光線を計算する場合、Zは任意であり、1に設定できます。ピンホールモデル方程式を適用すると、次のようになります。

ベクトル このベクトルをLadybug座標系に変換するには、セクション1.5に示す同次変換の3x3回転コンポーネントを適用するだけです。

ここで、RはTの左上3x3サブマトリックスです。このベクトルの原点は、Ladybugカメラ座標系に変換されたローカル座標系の原点になります。

レンズオフセット用に補正された3D光線へのピクセル位置の変換

2Dの未加工ピクセルを3D光線にマッピングすることは、各レンズ中心がLadybug座標系の中心からオフセットされているという事実によって複雑になります。最も正確な結果を得るには、Ladaybug座標系の中心からの方向だけではなく、光線に開始点と方向の両方が必要となります。

未加工ピクセルのマッピングは、次の2つのステップで進められます。

1. 未加工ピクセルを修正された座標にマッピングする – API: ladybugRectifyPixel()

/**
* 歪んだ(未加工)ピクセル位置を
修正イメージの対応する点にマッピングする。
*
* この関数は、ladybugSetOffScreenImageSize()の後に呼び出す必要があります。
* 修正された画像の解像度を設定します。
*
* @param context - LadybugContextがアクセスする
* @param uiCamera - この画像に対応するカメラインデックス。
* @param dDistortedRow - マッピングする歪んだ(未加工)ピクセルの行座標
* @param dDistortedCol - マッピングする歪んだ(未加工)ピクセルの列座標
* @param pdRectifiedRow - 同じ点の行座標を返す場所
* 修正された画像。
* @param pdRectifiedCol - 同じ点の列座標を返す場所
* 修正画像内の点
*
* @return A LadybugError 関数の成功を示す
* LADYBUG_OVEREXPOSEDは、選択した地域の平均
* 強度がどのチャネルでも254/255を超えている場合に返されます。
*
* @see ladybugSetOffScreenImageSize()を参照
*/
LADYBUGDLL_API LadybugError
ladybugRectifyPixel(
LadybugContext context、
unsigned int uiCamera、
double distortedRow、
double distortedCol、
double* pdRectifiedRow、
double* pdRectifiedCol

2. 修正された座標を光線の位置と方向にマッピングする – API:ladybugRCtoXYZ()

/**
* 特定のカメラ装置上の2DポイントをLadybugの3D光線に投影します。
* 座標フレーム。光線は開始点と方向として定義されます。
* 開始点は、ステッチング半径とは異なる距離にある光線の
* 正確な投影を可能にするLadybugカメルの中心からの
* カメラ装置のオフセットを考慮します。
*
* @param context - LadybugContextがアクセスする
* @param dRectifiedRow - 2D入力ポイントの修正行
* @param dRectifiedCol - 2D入力ポイントの修正列
* @param uiCamera - カメラ装置
* @param pdLocationX - 出力光線位置xコンポーネント
* @param pdLocationY - 出力光線位置yコンポーネント
* @param pdLocationZ - 出力光線位置zコンポーネント
* @param pdDirectionX - 出力光線方向xコンポーネント
* @param pdDirectionY - 出力光線方向yコンポーネント
* @param pdDirectionZ - 出力光線方向zコンポーネント
*
* @return A LadybugError 関数の成功を示す
*/
LADYBUGDLL_API LadybugError
ladybugRCtoXYZ(
LadybugContext context、
double dRectifiedRow,
double dRectifiedCol,
unsigned int uiCamera,
double* pdLocationX,
double* pdLocationY,
double* pdLocationZ,
double* pdDirectionX,
double* pdDirectionY,
double* pdDirectionZ);

このマッピングタイプのコード例、およびAPI機能に大きく依存しない他のマッピングタイプのコード例は、Ladybug SDKに含まれているladybugTranslate2dTo3dの例にあります。

3Dポイントのピクセル位置への変換

セクション1.6および1.7で説明されているピクセルから3Dへの問題を元に戻すことは、3Dポイントがどのレンズに投影されるかを最初に見つける必要があるため、少し複雑になります。それ以外の点では、ladybugXYZtoRC()関数を使用して簡単に行えます。関数ヘッダー情報を以下に示します。

/**
* 3Dポイント(Ladybug座標フレームに対して)を
* 表示されたカメラ装置ユニットに投影し、修正された画像に映る場所に
* 戻します。
*
* @param context - LadybugContextがアクセスする
* @param dLadybugX - 投影する点のX座標
* @param dLadybugY - 投影する点のY座標
* @param dLadybugZ - 投影する点のZ座標
* @param uiCamera - この画像に対応するカメラインデックス
* @param pdRectifiedRow - 3Dポイントが映る
* (ポイントが修正画像に投影しない場合は0未満となる)
* 戻された修正行位置
* @param pdRectifiedCol - 3Dポイントが映る
* (ポイントが修正画像に投影しない場合は0未満となる)
* 戻された修正列位置
* @param pdNormalized - 焦点距離によって正規化された
* 修正ピクセルから焦点中心までの距離 以下の場合はNULLに設定できます。
* 呼び出し元がこの値に関心がない。
*
* @return A LadybugError 関数の成功を示す
*/
LADYBUGDLL_API LadybugError
ladybugXYZtoRC(
LadybugContext context、
double dLadybugX,
double dLadybugY,
double dLadybugZ,
unsigned int uiCamera、
double* pdRectifiedRow、
double* pdRectifiedCol
double* pdNormalized)

3Dポイントが投影されるレンズを決定するために、この機能を6 つのレンズ位置のそれぞれに使用することができます(uiCameraパラメータを適切に設定することによる)。リターンコードが成功した場合(LADYBUG_OK)、dLadybugX、Y、Zによって定義された3Dポイントは、pdRectifiedRowおよびpdRectifiedColによって提供された修正された行および列位置でカメラuiCameraに投影されます。未加工の画像内のピクセルの位置は、ladybugUnrectifypPixelを使用して決定できます。

キャリブレーション精度:

以下に示すように、Ladybugカメラの平均精度は、10mの距離で2mm、または0.0116度です。

ladybug_3dray.jpg

ローカルからLadybugへの変換エラー

Ladybugカメラ座標系に関して、数学的モデルがレンズの実際の位置と方向とどの程度一致できるかに関連するエラーがあります。これは、実際の物理的位置とカメラのキャリブレーション中に計算された位置との違いに関連しています。

これは以下に関連しています。
レンズ座標系とLadybug座標系の関連付け
3Dポイントのピクセル位置への変換

修正エラー

数学モデルが基礎となるレンズの歪みにどの程度一致できるかに関連するエラーがあります。

これは以下に関連しています。
ピクセル位置の3D光線への変換
3Dポイントのピクセル位置への変換

カメラ中心の視差エラー

視差エラーは、上記の10mの精度で2mmに含まれない、追加の誤差源である。

視差エラーは、2つの異なる開始位置から同じ目的地を指す2つの光線の差です。この場合、位置の差はレンズ中心とカメラ座標中心の間にあります。

次の図は、レンズ中心が実際の位置にあるときとレンズ中心がLadybug座標系の中心にあるときの3D空間の同じ点を観察する角度の違いを示しています。

LD6 Equator Lens Parallax.png

LD6 Top Lens Parallax.png

5p-Equator Lens Parallax.png

5p-Top Lens Parallax.png