Main Content

relativeCameraPose

(非推奨) カメラの姿勢間の相対的な回転と並進を計算

relativeCameraPose は推奨されません。代わりに関数 estrelpose を使用してください。詳細については、互換性の考慮事項を参照してください。

説明

[relativeOrientation,relativeLocation] = relativeCameraPose(M,cameraParams,inlierPoints1,inlierPoints2) は、前の姿勢を基準としてキャリブレーションされたカメラの向きと位置を返します。2 つの姿勢は M によって関連付けられます。これは基礎行列、基本行列、affine2d 行列、または projective2d 行列でなければなりません。関数はスケールに沿ったカメラの位置を計算して、relativeLocation を単位ベクトルとして返します。

[relativeOrientation,relativeLocation] = relativeCameraPose(M,cameraParams1,cameraParams2,inlierPoints1,inlierPoints2) は、最初のカメラに対する 2 番目のカメラの向きと位置を返します。

[relativeOrientation,relativeLocation,validPointsFraction] = relativeCameraPose(M, ___) はさらに、両方のカメラの前面を投影するインライア点の割合を返します。

入力引数

すべて折りたたむ

基礎行列、基本行列、またはホモグラフィ行列。3 行 3 列の行列、affine2d オブジェクト、またはホモグラフィ行列を含む projective2d オブジェクトとして指定します。3 行 3 列の行列は、次の関数の 1 つを使用して得ることができます。

データ型: single | double

カメラ パラメーター。cameraParameters または cameraIntrinsics オブジェクトとして指定します。関数 estimateCameraParameters を使用して、cameraParameters オブジェクトを返すことができます。cameraParameters オブジェクトには、カメラの内部パラメーター、外部パラメーターおよびレンズ歪みパラメーターが含まれます。

カメラ 1 のカメラ パラメーター。cameraParameters または cameraIntrinsics オブジェクトとして指定します。関数 estimateCameraParameters を使用して、cameraParameters オブジェクトを返すことができます。cameraParameters オブジェクトには、カメラの内部パラメーター、外部パラメーターおよびレンズ歪みパラメーターが含まれます。

カメラ 2 のカメラ パラメーター。cameraParameters または cameraIntrinsics オブジェクトとして指定します。関数 estimateCameraParameters を使用して、cameraParameters オブジェクトを返すことができます。cameraParameters オブジェクトには、カメラの内部パラメーター、外部パラメーターおよびレンズ歪みパラメーターが含まれます。

ビュー 1 の対応する点の座標。M 個の [x,y] 座標の M 行 2 列の行列、または SIFTPoints オブジェクト、SURFPoints オブジェクト、MSERRegions オブジェクト、cornerPoints オブジェクトとして指定します。これらの点は、関数 estimateFundamentalMatrix または estimateEssentialMatrix を使用して取得できます。

ビュー 2 の対応する点の座標。M 個の [x,y] 座標の M 行 2 列の行列、または SIFTPoints オブジェクト、SURFPoints オブジェクト、MSERRegions オブジェクト、cornerPoints オブジェクトとして指定します。これらの点は、関数 estimateFundamentalMatrix または estimateEssentialMatrix を使用して取得できます。

出力引数

すべて折りたたむ

カメラの方向。3 行 3 列の行列として返されます。カメラを 1 つだけ使用する場合、行列は、最初のカメラの姿勢に対する 2 番目のカメラの姿勢の方向を記述します。2 つのカメラを使用する場合、行列は、カメラ 1 に対するカメラ 2 の方向を記述します。

データ型: single | double

カメラの位置。1 行 3 列の単位ベクトルとして返されます。カメラを 1 つだけ使用する場合、ベクトルは、最初のカメラの姿勢に対する 2 番目のカメラの姿勢の位置を記述します。2 つのカメラを使用する場合、ベクトルは、カメラ 1 に対するカメラ 2 の位置を記述します。

データ型: single | double

両方のカメラの前面を投影する有効なインライア点の割合。スカラーとして返されます。validPointsFraction がたとえば 0.9 未満など非常に小さい場合、基礎行列が正しくないことを示す可能性があります。

ヒント

  • カメラの姿勢 relativeOrientation および relativeLocation に対応するカメラの外部パラメーター rotationMatrix および translationVector を計算できます。

    [rotationMatrix,translationVector] = cameraPoseToExtrinsics(relativeOrientation,relativeLocation)
    前のカメラの姿勢の方向は単位行列 eye(3) であり、その位置は [0,0,0] です。

  • 次に、rotationMatrix および translationVector を関数 cameraMatrix への入力として使用することができます。

  • 入力の基礎行列から方向と位置の 4 つの可能な組み合わせを計算できます。組み合わせのうち 3 つは物理的に実現可能ではありません。なぜなら、片方または両方のカメラの背後の 3 次元の点を投影しているためです。関数 relativeCameraPoseinlierPoints1 および inlierPoints2 を使用して、実現可能な組み合わせを決定します。

拡張機能

バージョン履歴

R2016b で導入

すべて折りたたむ

R2022b: 非推奨

R2022b 以降、Computer Vision Toolbox™ のほとんどの関数は、左から乗算する規則を使用して幾何学的変換を作成および実行します。ただし、関数 relativeCameraPose は、右から乗算する規則を使用します。現時点で relativeCameraPose を削除する予定はありませんが、左から乗算する規則をサポートする関数 estrelpose に切り替えることで、幾何学的変換ワークフローを効率化できます。詳細については、Migrate Geometric Transformations to Premultiply Conventionを参照してください。

コードを更新するには、次を行います。

  • 関数名 relativeCameraPose のインスタンスを estrelpose に変更します。

  • 引数 cameraParamscameraIntrinsics オブジェクトを指定します。cameraParameters オブジェクトがある場合は、Intrinsics プロパティをクエリすることで cameraIntrinsics オブジェクトを取得できます。Intrinsics プロパティが関数 isempty に従って空だった場合、Intrinsics プロパティをクエリする前に、cameraParameters オブジェクトの ImageSize プロパティを任意のベクトルに設定します。次に例を示します。

    load worldToImageCorrespondences.mat
    if(isempty(cameraParams.Intrinsics))
        cameraParams.ImageSize = [128 128];
    end
    intrinsics = cameraParams.Intrinsics;
  • 2 つの出力引数 relativeOrientationrelativeLocation を 1 つの出力引数 relativePose に置き換えます。方向の行列と位置のベクトルを取得する必要がある場合は、引数 worldPose によって返される rigidtform3d オブジェクトの R プロパティと Translation プロパティをクエリできます。R の値が relativeOrientation の転置であることに注意してください。

次の表は、コードを更新する方法の例を示しています。

非推奨の使用方法推奨される代替案

この例では、関数 relativeCameraPose を使用し、引数 cameraParamscameraParameters オブジェクトとして指定して、単一のカメラの相対カメラ姿勢を計算します。

[relativeOrientationOld,relativeLocation] = relativeCameraPose( ...
    M,cameraParams,inlierPoints1,inlierPoints2)

この例では、cameraParameters オブジェクトの Intrinsics プロパティを使用してカメラの内部パラメーターを取得した後、関数 estrelpose を使用して相対カメラ姿勢を推定します。

intrinsics = cameraParams.Intrinsics;
relativePose = estrelpose( ...
     M,intrinsics,inlierPoints1,inlierPoints2);

カメラの相対的な方向と位置を取得する必要がある場合は、relativePose のプロパティをクエリできます。

relativeOrientation = relativePose.R;
relativeLocation = relativePose.Translation;

右から乗算する規則を使用していて方向が必要な場合は、relativePose.R の転置を取ります。

relativeOrientationOld = relativePose.R';

この例では、関数 relativeCameraPose を使用して、カメラ 1 に対するカメラ 2 の相対カメラ姿勢を計算します。

[relativeOrientation,relativeLocation] = relativeCameraPose( ...
    M,cameraParams1,cameraParams2,inlierPoints1,inlierPoints2)

この例では、2 つの cameraParameters オブジェクトの Intrinsics プロパティを使用して 2 つのカメラの内部パラメーターを取得した後、関数 estrelpose を使用して相対カメラ姿勢を推定します。

intrinsics1 = cameraParams1.Intrinsics;
intrinsics2 = cameraParams2.Intrinsics;
relativePose = estrelpose( ...
     M,intrinsics1,intrinsics2,inlierPoints1,inlierPoints2);