Main Content

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

extrinsics

(非推奨) キャリブレートされたカメラの位置を計算

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

説明

[rotationMatrix,translationVector] = extrinsics(imagePoints,worldPoints,cameraParams) は、3 次元回転行列と 3 次元並進ベクトルを返し、ワールド座標の点をカメラ座標系に変換できるようにします。

すべて折りたたむ

一連のキャリブレーション イメージを作成します。

  images = imageDatastore(fullfile(toolboxdir('vision'),'visiondata', ...
      'calibration', 'slr'));

イメージ内のチェッカーボードのコーナーを検出します。

[imagePoints,boardSize] = detectCheckerboardPoints(images.Files);

左上隅が (0,0) のパターン中心の座標系でチェッカーボードのコーナーのワールド座標を生成します。正方形のサイズはミリメートル単位です。

squareSize = 29;
worldPoints = generateCheckerboardPoints(boardSize, squareSize);

カメラのキャリブレーションを行います。

I = readimage(images,1); 
imageSize = [size(I,1), size(I,2)];
cameraParams = estimateCameraParameters(imagePoints,worldPoints, ...
                              'ImageSize',imageSize);

新しい位置でイメージを読み込みます。

imOrig = imread(fullfile(matlabroot,'toolbox','vision','visiondata', ...
    'calibration','slr','image9.jpg'));
figure 
imshow(imOrig);
title('Input Image');

Figure contains an axes object. The axes object with title Input Image contains an object of type image.

イメージの歪みを補正します。

[im,newOrigin] = undistortImage(imOrig,cameraParams,'OutputView','full');

新しいイメージで参照オブジェクトを検出します。

[imagePoints,boardSize] = detectCheckerboardPoints(im);

イメージ座標系のシフトを補正します。

imagePoints = [imagePoints(:,1) + newOrigin(1), ...
             imagePoints(:,2) + newOrigin(2)];

新しい外部パラメーターを計算します。

[rotationMatrix, translationVector] = extrinsics(...
imagePoints,worldPoints,cameraParams);

カメラの姿勢を計算します。

[orientation, location] = extrinsicsToCameraPose(rotationMatrix, ...
  translationVector);
figure
plotCamera('Location',location,'Orientation',orientation,'Size',20);
hold on
pcshow([worldPoints,zeros(size(worldPoints,1),1)], ...
  'VerticalAxisDir','down','MarkerSize',40);

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

入力引数

すべて折りたたむ

点のイメージ座標。M 行 2 列の配列として指定します。配列には M 個の [x y] 座標が含まれます。入力 imagePoints と入力 worldPoints は両方が double であるか、両方が single でなければなりません。

データ型: single | double

イメージ座標に対応するワールド座標。M 行 2 列の行列として指定します。入力 imagePoints と入力 worldPoints は両方が double であるか、両方が single でなければなりません。関数は、z= 0 と同一平面上にあるものと仮定し、点の数 M は少なくとも 4 つなければなりません。

データ型: single | double

カメラ パラメーターを保存するオブジェクト。cameraParameters, cameraIntrinsics オブジェクトまたは fisheyeIntrinsics オブジェクトとして指定します。これらのオブジェクトは、関数 estimateCameraParameters、関数 estimateFisheyeParameters またはカメラ キャリブレーター アプリで返されます。オブジェクトには、カメラの内部パラメーター、外部パラメーターおよびレンズ歪みパラメーターが含まれます。

出力引数

すべて折りたたむ

3 次元回転。3 行 3 列の行列として返されます。回転行列を並進ベクトルと共に使用して、ワールド座標からカメラ座標系に点を変換できます。

入力 imagePoints と入力 worldPoints をクラス double に設定すると、関数は rotationMatrix および translationVectordouble として返します。そうでない場合、single になります。

3 次元並進。1 行 3 列のベクトルとして返されます。回転行列を並進ベクトルと共に使用して、ワールド座標からカメラ座標系に点を変換できます。

入力 imagePoints と入力 worldPoints をクラス double に設定すると、関数は rotationMatrix および translationVectordouble として返します。そうでない場合、single になります。

アルゴリズム

関数 extrinsics は、worldPoints が M 行 2 列の行列として指定されているかどうかに応じて、2 つの異なるアルゴリズムを使用して外部パラメーターを計算します。z= 0 である同一平面上の点については、M 行 2 列の行列を使用してください。

関数 extrinsics は、1 つのイメージの回転行列と並進ベクトルを閉形式で計算します。キャリブレーション中は、すべてのキャリブレーション イメージで再投影誤差が最小になるように、外部パラメーターが数値的に推定されます。そのため、キャリブレーション イメージの 1 つに対して関数 extrinsics を使用すると、キャリブレーション中に得られたものとは少し異なる回転行列と並進ベクトルが返されることがあります。

拡張機能

バージョン履歴

R2014a で導入

すべて折りたたむ

R2022b: 非推奨

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

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

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

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

    load worldToImageCorrespondences.mat
    if(isempty(cameraParams.Intrinsics))
        cameraParams.ImageSize = [128 128];
    end
    intrinsics = cameraParams.Intrinsics;

  • 2 つの出力引数 rotationMatrixtranslationVector を 1 つの出力引数 camExtrinsics に置き換えます。引数 camExtrinsicsrigidtform3d オブジェクトを返します。方向の行列と位置のベクトルを取得する必要がある場合は、オブジェクトの R プロパティと Translation プロパティをクエリできます。R の値が rotationMatrix の転置であることに注意してください。

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

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

この例では、関数 exrinsics を使用し、引数 cameraParamscameraParameters オブジェクトとして指定して、キャリブレーションされたカメラの位置を計算します。

[rotMatrix,transVector] = extrinsics( ...
    imagePoints,worldPoints,cameraParams);

この例では、cameraParameters オブジェクトの Intrinsics プロパティを使用してカメラの内部パラメーターを取得した後、関数 estimateExtrinsics を使用してキャリブレートされたカメラの位置を計算します。

intrinsics = cameraParams.Intrinsics;
camExtrinsics = estimateExtrinsics( ...
     imagePoints,worldPoints,intrinsics);

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

rotMatrix = camExtrinsics.R;
transVector = camExtrinsics.Translation;

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

rotMatrix = camExtrinsics.R';