Main Content

bundleAdjustment

3 次元の点とカメラの姿勢のコレクションの調整

説明

[xyzRefinedPoints,refinedPoses] = bundleAdjustment(xyzPoints,pointTracks,cameraPoses,intrinsics) は、再投影誤差が最小になるように 3 次元の点およびカメラの姿勢を調整します。調整の手順は、レーベンバーグ・マルカート アルゴリズムのバリアントです。この関数は、同じグローバル参照座標系を使用して、3 次元の点とカメラの姿勢の両方を返します。

[wpSetRefined,vSetRefined,pointIndex] = bundleAdjustment(wpSet,vSet,viewIDs,intrinsics) は、ワールド ポイント セット wpSet の 3 次元の点を調整し、イメージ ビュー セット vSet のカメラの姿勢を調整します。viewIDs は、調整する vSet でカメラの姿勢を指定します。

[___,reprojectionErrors] = bundleAdjustment(___) は、前述の構文の引数に加えて、各 3 次元ワールド ポイントの平均再投影誤差を返します。

[___] = bundleAdjustment(___,Name=Value) は、前の構文にある引数の任意の組み合わせに加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、MaxIterations=50 は、反復回数を 50 に設定します。指定していない引数は既定値になります。

すべて折りたたむ

初期化するデータを読み込みます。

data = load("globeBA.mat");

カメラの姿勢および点を調整します。

[xyzRefinedPoints,refinedPoses] = ...
    bundleAdjustment(data.xyzPoints,data.pointTracks,data.cameraPoses,data.intrinsics);

調整前と調整後の 3 次元の点とカメラの姿勢を表示します。

pcshowpair(pointCloud(data.xyzPoints), pointCloud(xyzRefinedPoints), ...
    AxesVisibility="on", VerticalAxis="y", VerticalAxisDir="down", MarkerSize=40);
hold on
plotCamera(data.cameraPoses, Size=0.1, Color="m");
plotCamera(refinedPoses, Size=0.1, Color="g");
legend("Before refinement", "After refinement", color="w");

Figure contains an axes object. The axes object contains 102 objects of type line, text, patch, scatter. These objects represent Before refinement, After refinement.

入力引数

すべて折りたたむ

未調整の 3 次元の点。[x y z] の位置の M 行 3 列の行列として指定します。

複数のイメージにわたってマッチする点。pointTrack オブジェクトの N 要素の配列として指定します。各要素には、複数のイメージにわたってマッチする点が 2 つ以上含まれます。

カメラの姿勢の情報。列 ViewId と列 AbsolutePose をもつ 2 列の table として指定します。ビュー ID は、pointTracks 引数内のオブジェクトの ID に関連しています。オブジェクト関数 poses を使用して、cameraPoses の table を取得できます。

カメラの内部パラメーター。cameraIntrinsics オブジェクト、または cameraIntrinsics オブジェクトの N 要素の配列として指定します。N はカメラの姿勢の数、または viewIDs 内の ID の数です。同一のカメラを使用してイメージが撮影されている場合は、単一の cameraIntrinsics オブジェクトを使用します。異なるカメラでイメージが撮影されている場合は、cameraIntrinsics オブジェクトのベクトルを使用します。

3 次元ワールド ポイント。worldpointset オブジェクトとして指定します。

カメラの姿勢。imageviewset オブジェクトとして指定します。

ビューの識別子。N 要素の配列として指定します。viewIDs は、どのカメラの姿勢を調整するかを表し、その関連するビューを imageviewset で指定します。

名前と値の引数

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

例: MaxIterations=50 は、反復回数を 50 に設定します。

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

レーベンバーグ・マルカート アルゴリズムが停止するまでの最大反復回数。正の整数として指定します。

ピクセル単位の平均二乗再投影誤差の絶対終了許容誤差。正のスカラーとして指定します。

反復間の再投影誤差の除去の相対終了許容誤差。正のスカラーとして指定します。

レンズ歪みを示すフラグ。false または true として指定します。PointsUndistortedfalse に設定すると、pointTracksvSet の 2 次元の点は、レンズ歪みをもつイメージになければなりません。歪み補正後の点を使用するには、最初に関数 undistortImage を使用してイメージから歪みを除去し、PointsUndistorted に設定します。

固定のカメラの姿勢のビュー ID。非負の整数のベクトルとして指定します。各 ID は、cameraPoses の固定のカメラの姿勢の ViewId に対応します。FixedViewIDs の空の値は、すべてのカメラの姿勢が最適化されていることを意味します。

ソルバー。"sparse-linear-algebra" または "preconditioned-conjugate-gradient" として指定します。スパース性の低いイメージには "sparse-linear-algebra" ソルバーを使用します。スパース性が低いということは、多くのカメラ ビューが同一のワールド ポイントを複数観測していることを示しています。スパース性が高いイメージには、General Graphic Optimization (g2o) ライブラリの "preconditioned-conjugate-gradient" (PCG) ソルバーを使用します。スパース性が高いということは、各カメラ ビューが、xyzPoints で指定されたワールド ポイントのごく一部のみを観測していることを示します。

進行状況の表示。false または true として指定します。

出力引数

すべて折りたたむ

調整されたワールド ポイントの 3 次元での位置。[x y z] の位置の M 行 3 列の行列として返されます。

データ型: single | double

調整されたカメラの姿勢。2 列の table として返されます。table には ViewId および AbsolutePose の列が含まれます。

調整された 3 次元ワールド ポイント。worldpointset オブジェクトとして返されます。

調整されたカメラの姿勢。imageviewset オブジェクトとして指定します。

調整された 3 次元ワールド ポイントの wpSetRefined へのインデックス。M 要素の配列として返されます。

再投影誤差。M 要素のベクトルとして返されます。関数は、各ワールド ポイントを各カメラに投影します。その後、各イメージで検出された点と再投影された点の間の距離として、再投影誤差を計算します。reprojectionErrors ベクトルには、各ワールド ポイントの平均再投影誤差が含まれます。

Detected point and reprojected point next to each other, with reprojection error as the distance between them

参照

[1] Lourakis, Manolis I. A., and Antonis A. Argyros. "SBA: A Software Package for Generic Sparse Bundle Adjustment." ACM Transactions on Mathematical Software 36, no. 1 (March 2009): 2:1–2:30.

[2] Hartley, Richard, and Andrew Zisserman. Multiple View Geometry in Computer Vision. 2nd ed. Cambridge, UK ; New York: Cambridge University Press, 2003.

[3] Triggs, Bill, Philip F. McLauchlan, Richard I. Hartley, and Andrew W. Fitzgibbon. "Bundle Adjustment — A Modern Synthesis." In Proceedings of the International Workshop on Vision Algorithms, 298–372. Springer-Verlag, 1999.

拡張機能

バージョン履歴

R2016a で導入

すべて展開する