Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

estimateWorldCameraPose

(非推奨) 3 次元から 2 次元への対応関係からカメラの姿勢を推定

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

説明

[worldOrientation,worldLocation] = estimateWorldCameraPose(imagePoints,worldPoints,cameraParams) は、キャリブレートされたカメラの方向と位置をワールド座標系で返します。入力 worldPoints は、ワールド座標系で定義しなければなりません。

この関数は、透視 3 点 (P3P) アルゴリズムを使用して透視 n 点 (PnP) 問題を解きます[1]。関数は、M-estimator sample consensus (MSAC) アルゴリズムを使用して、外れ値の誤った対応関係を排除します。インライアは、カメラの姿勢の計算に使用されるイメージ ポイントとワールド ポイントの間の対応関係です。

[___,inlierIdx] = estimateWorldCameraPose(imagePoints,worldPoints,cameraParams) は、前の構文の引数に加え、カメラの姿勢の計算に使用されたインライアのインデックスを返します。

[___,status] = estimateWorldCameraPose(imagePoints,worldPoints,cameraParams) はさらに、点の数が十分であったかどうかを示すステータス コードを返します。

[___] = estimateWorldCameraPose(___,Name,Value) は、前述の構文のいずれかを使用し、Name,Value ペアの引数を 1 つ以上指定したオプションを追加で使用します。

すべて折りたたむ

事前に計算されたワールドとイメージの対応関係を読み込みます。

data = load('worldToImageCorrespondences.mat');

ワールド カメラの姿勢を推定します。

[worldOrientation,worldLocation] = estimateWorldCameraPose(...
     data.imagePoints,data.worldPoints,data.cameraParams);

ワールド ポイントをプロットします。

 pcshow(data.worldPoints,'VerticalAxis','Y','VerticalAxisDir','down', ...
     'MarkerSize',30);
 hold on
 plotCamera('Size',10,'Orientation',worldOrientation,'Location',...
     worldLocation);
 hold off

Figure contains an axes object. The axes object contains 11 objects of type line, text, patch, scatter.

入力引数

すべて折りたたむ

歪み補正後のイメージ ポイントの座標。[x,y] 座標の M 行 2 列の配列として指定します。イメージ ポイントの数 M は、少なくとも 4 つなければなりません。

関数ではレンズ歪みが考慮されません。関数 undistortImage を使用してイメージ ポイント検出前にイメージの歪みを補正するか、関数 undistortPoints を使用してイメージ ポイント自体の歪みを補正できます。

データ型: single | double

ワールド ポイントの座標。[x,y,z] 座標の M 行 3 列の配列として指定します。

データ型: single | double

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

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: 'MaxNumTrials',1000

ランダム試行の最大回数。正の整数スカラーとして指定します。試行の実際の回数は、イメージの数とワールド ポイントの数、および MaxReprojectionErrorConfidence プロパティの値によって異なります。試行回数を多くすると出力のロバスト性は向上しますが、計算量が増加します。

最大数のインライアの検出の信頼度。(0,100) の範囲のスカラーとして指定します。この値を大きくすると出力のロバスト性は向上しますが、計算量が増加します。

外れ値を検出するための再投影誤差しきい値。ピクセル単位の正の数値スカラーとして指定します。この値を大きくするとアルゴリズムの収束が早くなりますが、結果の精度が低下することがあります。MaxReprojectionError よりも大きい再投影誤差のある対応関係は外れ値と見なされ、カメラの姿勢の計算に使用されません。

出力引数

すべて折りたたむ

ワールド座標におけるカメラの方向。3 行 3 列の行列として返されます。

データ型: double

カメラの位置。1 行 3 列の単位ベクトルとして返されます。

データ型: double

インライア点のインデックス。M 行 1 列の logical ベクトルとして返されます。ベクトル内の logical true の値は、imagePointsworldPoints で表現されるインライアに対応します。

ステータス コード。01 または 2 として返されます。

ステータス コードステータス
0エラーなし
1imagePointsworldPoints に十分な数の点が含まれていません。最低 4 つの点が必要です。
2十分な数のインライアが見つかりませんでした。最低 4 つのインライアが必要です。

参照

[1] Gao, X.-S., X.-R. Hou, J. Tang, and H.F. Cheng. "Complete Solution Classification for the Perspective-Three-Point Problem." IEEE Transactions on Pattern Analysis and Machine Intelligence. Volume 25,Issue 8, pp. 930–943, August 2003.

[2] Torr, P.H.S., and A. Zisserman. "MLESAC: A New Robust Estimator with Application to Estimating Image Geometry." Computer Vision and Image Understanding. 78, no. 1 (April 2000): 138–56. https://doi.org/10.1006/cviu.1999.0832.

拡張機能

バージョン履歴

R2016b で導入

すべて折りたたむ

R2022b: 非推奨

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

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

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

  • 引数 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 つの出力引数 worldOrientationworldLocation を 1 つの出力引数 worldPose に置き換えます。方向の行列と位置のベクトルを取得する必要がある場合は、引数 worldPose によって返される rigidtform3d オブジェクトの R プロパティと Translation プロパティをクエリできます。R の値が worldOrientation の転置であることに注意してください。

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

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

この例では、関数 estimateWorldCameraPose を使用し、引数 cameraParamscameraParameters オブジェクトとして指定してカメラの姿勢を推定します。

[worldOrientation,worldLocation] = estimateWorldCameraPose( ...
     imagePoints,worldPoints,cameraParams);

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

intrinsics = cameraParams.Intrinsics;
worldPose = estworldpose( ...
     imagePoints,worldPoints,intrinsics);

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

worldOrientation = worldPose.R;
worldLocation = worldPose.Translation;

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

worldOrientation = worldPose.R';