デバイスのカメラの内部パラメタと外部パラメタを理解することは、プロジェクトタンゴデバイス内の仮想世界と現実世界での画像を位置合わせするために重要です。
タンゴAPIから内部パラメタを取得
TangoCameraIntrinsics構造体には、すべてのカメラとセンサーの内部パラメタがあります。
typedef struct TangoCameraIntrinsics {
TangoCameraId camera_id;
TangoCalibrationType calibration_type;
uint32_t width;
uint32_t height;
double fx;
double fy;
double cx;
double cy;
double distortion[5];
} TangoIntrinsics;
width
とheightは
ピクセル単位で画像の幅と高さです。
fx
とfy
はピクセル単位でのx
/ y軸の焦点距離です。
cx
とcy
は、ピクセル単位x/y座標の主点です。(詳細については、Wikipediaのピンホールカメラモデル の主点Rを参照してください)
distortionは、
レンズ歪み係数の配列です。(詳細はWikipediaのCamera
Resectioningとレンズ歪みを参照してください。)
カラーカメラの内部パラメタは以下のように取得できます。
TangoCameraIntrinsics ccIntrinsics;
TangoService_getCameraIntrinsics(TANGO_CAMERA_COLOR, &ccIntrinsics);
カメラの視野角(FOV)の計算
カメラやセンサーの視野を計算する方法を理解することは、いくつかのユースケースのために非常に重要です。例えば、拡張現実アプリケーションでは、デバイスのカメラと仮想世界を位置合わせさせる必要があります。ビデオのオーバーレイが、仮想コンテンツのレンダリングと一致することを確認するには、デバイスのカメラの視野と使用しているレンダリングツールにおける仮想カメラの視野を一致させる必要があります。
水平/垂直のFOVを計算するために、センサの画像平面のアスペクト比(幅/高さ)、および水平焦点距離(Fx)と垂直焦点距離(Fy)が必要です。ほとんどのシステムでは、Fx= Fyです。
水平および垂直の視野角の計算式は、次のとおりです。
Horizontal FOV = 2 * atan(0.5 * width / Fx)
Vertical FOV = 2 * atan(0.5 * height / Fy)
レンダリングエンジンが1つだけのFOV値をサポートしている場合、これが水平か垂直FOVであるべきかどうかを知るためにエンジンのドキュメントを参照してください。対角視野角が必要な場合は、次のように計算することができます
Diagonal FOV = 2 * atan((sqrt(width^2 * height^2) / (Fx+Fy)))
視野角を計算するためのすべてのパラメータは、TangoService_getCameraIntrinsics()を呼び出すことで、APIから取得できます。
たとえば、上記のようにカラーカメラの内部パラメタを取得する場合:
TangoCameraIntrinsics ccIntrinsics;
TangoService_getCameraIntrinsics(TANGO_CAMERA_COLOR, &ccIntrinsics);
ccIntrinsics
構造体を調べるときは、次のデータを参照してください。
ccIntrinsics.height=720;
ccIntrinsics.fy=1042.0;
Vertical FOV = 2*atan(0.5*720.0/1042.0) = 2*19.0549 deg = 38.1098 deg
視野の計算の詳細については、Wikipedia articleのAngle of Viewを参照してください。。
タンゴAPIから外部パラメタの取得
異なる座標系のペアを使うことによって2つの異なるカメラ/センサ間の姿勢として取得することができます。たとえば、カラーカメラとIMU間の外因を取得したい場合:
//Color Camera Frame with respect to IMU Frame
TangoPoseData cToIMUPose;
TangoCoordinateFramePair cToIMUPair;
cToIMUPair.base = TANGO_COORDINATE_FRAME_IMU;
cToIMUPair.target = TANGO_COORDINATE_FRAME_CAMERA_COLOR;
TangoService_getPoseAtTime(0.0, cToIMUPair, &cToIMUPose);
cToIMU_position = ToVector(cToIMUPose.translation[0],
cToIMUPose.translation[1],
cToIMUPose.translation[2]);
cToIMU_rotation = ToQuaternion(cToIMUPose.orientation[3],
cToIMUPose.orientation[0],
cToIMUPose.orientation[1],
cToIMUPose.orientation[2]);
常に推奨される姿勢データを取得する方法は、コールバックを使用することですが、デバイスのキャリブレーションの外部パラメタは通常は変更されないため、カメラの外部パラメタを取得するためにはgetPoseAtTime
を呼び出すだけでよいです。