Main Content

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

estimateCameraParameters

単一カメラまたはステレオ カメラをキャリブレーションします。

説明

[cameraParams,imagesUsed,estimationErrors] = estimateCameraParameters(imagePoints,worldPoints) は、単一カメラの内部パラメーターと外部パラメーター、および歪み係数を含む cameraParameters オブジェクト、cameraParams を返します。この関数は、カメラ パラメーターの推定に使用されたイメージと、単一カメラのキャリブレーションの標準推定誤差も返します。関数 estimateCameraParameters は、外部パラメーターと内部パラメーターを推定します。

[stereoParams,pairsUsed,estimationErrors] = estimateCameraParameters(imagePoints,worldPoints) は、ステレオ カメラのパラメーターを含む stereoParameters オブジェクト、stereoParams を返します。この関数は、ステレオ パラメーターの推定に使用されたイメージと、ステレオ カメラのキャリブレーションの標準推定誤差も返します。

cameraParams = estimateCameraParameters(___,Name,Value) は、上記の構文のいずれかを使用して、Name,Value の引数を 1 つ以上指定した cameraParams オブジェクト プロパティを構成します。プロパティが未指定の場合は既定値になります。

すべて折りたたむ

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

images = imageSet(fullfile(toolboxdir('vision'),'visiondata',...
            'calibration','mono'));
imageFileNames = images.ImageLocation;

キャリブレーション パターンを検出します。

[imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames);

四角形のコーナーのワールド座標を生成します。

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

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

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

キャリブレーションの精度を可視化します。

showReprojectionErrors(params);

Figure contains an axes object. The axes object with title Mean Reprojection Error per Image, xlabel Images, ylabel Mean Error in Pixels contains 3 objects of type bar, line. This object represents Overall Mean Error: 0.18 pixels.

カメラの外部パラメーターを可視化します。

figure;
showExtrinsics(params);

Figure contains an axes object. The axes object with title Extrinsic Parameters Visualization, xlabel X (mm), ylabel Z (mm) contains 23 objects of type patch, text, line.

drawnow;

検出して再射影された点をプロットします。

figure; 
imshow(imageFileNames{1}); 
hold on;
plot(imagePoints(:,1,1), imagePoints(:,2,1),'go');
plot(params.ReprojectedPoints(:,1,1),params.ReprojectedPoints(:,2,1),'r+');
legend('Detected Points','ReprojectedPoints');
hold off;

Figure contains an axes object. The axes object contains 3 objects of type image, line. One or more of the lines displays its values using only markers These objects represent Detected Points, ReprojectedPoints.

キャリブレーション イメージを指定します。

leftImages = imageDatastore(fullfile(toolboxdir("vision"),"visiondata", ...
    "calibration","stereo","left"));
rightImages = imageDatastore(fullfile(toolboxdir("vision"),"visiondata", ...
    "calibration","stereo","right"));

チェッカーボードを検出します。

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

チェッカーボード キーポイントのワールド座標を指定します。正方形のサイズはミリメートル単位です。

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

ステレオ カメラ システムをキャリブレーションします。両方のカメラの解像度は同じです。

I = readimage(leftImages,1); 
imageSize = [size(I,1) size(I,2)];
params = estimateCameraParameters(imagePoints,worldPoints, ...
    "ImageSize",imageSize);

キャリブレーションの精度を可視化します。

showReprojectionErrors(params)

Figure contains an axes object. The axes object with title Mean Reprojection Error per Image, xlabel Image Pairs, ylabel Mean Error in Pixels contains 5 objects of type bar, line. These objects represent Camera 1, Camera 2, Overall Mean Error: 0.06 pixels.

カメラの外部パラメーターを可視化します。

figure
showExtrinsics(params)

Figure contains an axes object. The axes object with title Extrinsic Parameters Visualization, xlabel X (mm), ylabel Z (mm) contains 28 objects of type patch, text, line.

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

imds = imageDatastore(fullfile(toolboxdir('vision'),'visiondata',...
                        'calibration','circleGrid','mono'));
calibrationImages = readall(imds);
calibrationImages = cat(4,calibrationImages{:});

円グリッド パターンの次元を定義します。

patternDims = [8 11];

キャリブレーション イメージ内のパターンを検出します。

imagePoints = detectCircleGridPoints(calibrationImages, patternDims,...
                        'PatternType','symmetric');

円グリッド キーポイントのワールド座標を指定します。中心距離はミリメートル単位です。

centerDistance = 18;
worldPoints = generateCircleGridPoints(patternDims,centerDistance,...
                        'PatternType','symmetric');

キャリブレーション イメージを使用してカメラのキャリブレーションを行います。

imageSize = size(calibrationImages,1:2);
params = estimateCameraParameters(imagePoints,worldPoints,...
                        'ImageSize',imageSize);

検出されたパターン グリッドと再投影された点をプロットします。

figure
imshow(calibrationImages(:,:,:,1))
hold on
plot(imagePoints(:,1,1), imagePoints(:,2,1),'gx','MarkerSize',8)
plot(params.ReprojectedPoints(:,1,1),params.ReprojectedPoints(:,2,1),'r+','MarkerSize',8)
legend('Detected Points','ReprojectedPoints')
hold off

Figure contains an axes object. The axes object contains 3 objects of type image, line. One or more of the lines displays its values using only markers These objects represent Detected Points, ReprojectedPoints.

入力引数

すべて折りたたむ

キャリブレーション パターンのキー ポイント。[x,y] 内部パラメーター イメージ座標の配列として指定します。

キャリブレーション[x,y] キー ポイントの入力配列
単一カメラ

点 [x,y] の M x 2 x numImages の配列。

  • イメージ数 numImages は 2 以上でなければなりません。

  • 各パターンのキー ポイント座標の数を示す M は、3 より大きくなければなりません。

部分検出パターンは、単一カメラのキャリブレーションでのみサポートされます。部分検出パターンを推定に含めるには、欠損キーポイントの x-y 座標として [NaN,NaN] を使用します。

ステレオ カメラ

点 [x,y] の M x 2 x numPairs x 2 の配列。

  • numPairs は、キャリブレーション パターンを含むステレオ イメージのペアの数です。

  • 各パターンのキー ポイント座標の数を示す M は、3 より大きくなければなりません。

  • imagePoints(:,:,:,1) はカメラ 1 の点です。

  • imagePoints(:,:,:,2) はカメラ 2 の点です。

データ型: single | double

ワールド座標のキャリブレーション パターンのキー ポイント。M 個の [x,y] ワールド座標の M 行 2 列の配列として指定します。パターンは平面でなければならないため、z 座標はゼロになります。

データ型: single | double

名前と値の引数

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

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

例: "WorldUnits","mm" は、ワールド ポイントの単位をミリメートルに設定します。

ワールド ポイント単位。文字ベクトルまたは string スカラーとして指定します。

せん断推定。logical スカラーとして指定します。このプロパティを true に設定すると、関数はイメージの座標軸のせん断を推定します。false に設定すると、イメージの座標軸が厳密に直行し、関数はせん断をゼロに設定します。

推定する半径方向歪み係数の数。値 2 または 3 として指定します。

半径方向歪みとは、主点から伸びる放射状の線に沿ったイメージ ポイントの変位です。

  • イメージ ポイントが主点から離れると (半径方向の正の変位)、イメージの倍率が下がり、イメージに糸巻き型歪みが出現する。

  • イメージ ポイントが主点に向かって移動すると (半径方向の負の変位)、イメージの倍率が上がり、イメージに樽状の歪みが出現する。

Three grids that each represent a type of distortion. One with pincushion distortion (positive radial displacement), one with no distortion, and one with barrel distortion (negative radial displacement)

半径方向の歪み係数は、このタイプの歪みをモデル化します。歪んだ点は (xdistorted, ydistorted) として次のように表されます。

xdistorted = x(1 + k1*r2 + k2*r4 + k3*r6)

ydistorted= y(1 + k1*r2 + k2*r4 + k3*r6)

  • x、y — 歪み補正後のピクセル位置。x と y は正規化されたイメージ座標内にあります。正規化されたイメージ座標は、光学的中心への変換後にピクセル単位の焦点距離で除算したピクセル座標から求められます。したがって、x と y は次元がありません。

  • k1、k2 および k3 — レンズの半径方向の歪み係数。

  • r2 = x2 + y2

一般に、キャリブレーションを行うには 2 つの係数で十分です。広角レンズなどの歪みが大きい場合には、3 つの係数を選択して k3 を含めることができます。

円周方向歪みフラグ。logical スカラーとして指定します。このプロパティを true に設定すると、関数は円周方向の歪みを推定します。false に設定すると、円周方向の歪みを無視できます。

円周方向の歪みは、レンズとイメージ平面が平行にならない場合に生じます。円周方向の歪み係数は、このタイプの歪みをモデル化します。

Comparison of zero tangential distortion and tangential distortion

歪んだ点は (xdistorted, ydistorted) として次のように表されます。

xdistorted = x + [2 * p1 * x * y + p2 * (r2 + 2 * x2)]

ydistorted = y + [p1 * (r2 + 2 *y2) + 2 * p2 * x * y]

  • x、y — 歪み補正後のピクセル位置。x と y は正規化されたイメージ座標内にあります。正規化されたイメージ座標は、光学的中心への変換後にピクセル単位の焦点距離で除算したピクセル座標から求められます。したがって、x と y は次元がありません。

  • p1 および p2 — レンズの円周方向の歪み係数。

  • r2 = x2 + y2

カメラの内部パラメーターの初期推定。3 行 3 列の行列として指定します。行列の形式は次のようになります。

[fxscx0fycy001]

座標 [cx cy] は光学的中心 (主点) をピクセル単位で表します。x 軸と y 軸が厳密に直交する場合、せん断パラメーター s は 0 に等しくなります。

fx = F*sx

fy = F*sy

  • F は焦点距離のワールド単位で、通常はミリメートル単位で表されます。

  • sx と sy は、それぞれ x 方向と y 方向のワールド単位あたりのピクセル数です。

  • fx と fy はピクセル単位で表されます。

初期値を指定しない場合、関数は線形最小二乗法を使用して内部パラメーターの初期行列を計算します。

半径方向歪み係数の初期推定。2 要素または 3 要素のベクトルとして指定します。初期値を指定しない場合、関数はすべての係数の初期値に 0 を使用します。

カメラによって生成されるイメージのサイズ。1 行 2 列のベクトル [mrows, ncols] として指定します。

出力引数

すべて折りたたむ

カメラ パラメーター。cameraParameters オブジェクトとして返されます。

カメラ パラメーターの推定に使用するイメージ。P 行 1 列の logical 配列として返されます。P はイメージの数に対応します。配列は、カメラ パラメーターの推定に使用されたイメージを示します。配列内の logical true は、カメラ パラメーターの推定に使用されたイメージを示します。

関数は、ワールド ポイントと各イメージで検出された点の間のホモグラフィを計算します。イメージのホモグラフィの計算が失敗すると、関数は警告を発行します。このイメージの点はカメラ パラメーターの推定に使用されません。関数はさらに、imagesUsed の対応する要素を false に設定します。

推定されたパラメーターの標準誤差。cameraCalibrationErrors オブジェクトまたは stereoCalibrationErrors オブジェクトとして返されます。

ステレオ システムのカメラ パラメーター。stereoParameters オブジェクトとして返されます。このオブジェクトには、ステレオ カメラ システムの内部パラメーター、外部パラメーターおよびレンズ歪みパラメーターが含まれます。

カメラ パラメーターの推定に使用されたイメージのペア。P 行 1 列の logical 配列として返されます。P はイメージのペアの数に対応します。配列内の logical true の値は、カメラ パラメーターの推定に使用されたイメージのペアを示します。

アルゴリズム

すべて折りたたむ

キャリブレーションのアルゴリズム

カメラ キャリブレーター アプリのカメラで使用できる視野 (FOV) は 95 度までです。キャリブレーションのアルゴリズムでは、ピンホール カメラ モデルを想定しています。

次の方程式は、ワールド座標 [X Y Z] と対応するイメージ ポイント [x y] を関連付ける変換を行います。

w[xy1]=K[Rt][XYZ1]

  • w: 任意のスケール係数

  • K: カメラの内部パラメーターの行列

  • R: カメラの 3 次元回転を表す行列

  • t: ワールド座標系に対するカメラの並進

カメラのキャリブレーションでは、内部パラメーター、外部パラメーターおよび歪み係数の値を推定します。カメラのキャリブレーションには次の 2 つの手順が含まれます。

  1. レンズ歪みをゼロと仮定し、閉形式で内部パラメーターと外部パラメーターを求めます。[1]

  2. 非線形最小二乗の最小化 (レーベンバーグ・マルカート アルゴリズム) を使用して、歪み係数を含むすべてのパラメーターを同時に推定します。前の手順で求めた閉形式の解を、内部パラメーターと外部パラメーターの初期推定値として使用します。その後、歪み係数の初期推定値をゼロに設定します。[1][2]

参照

[1] Zhang, Z. "A Flexible New Technique for Camera Calibration." IEEE Transactions on Pattern Analysis and Machine Intelligence 22, no. 11 (November 2000): 1330–34. https://doi.org/10.1109/34.888718.

[2] Heikkila, J., and O. Silven. “A Four-Step Camera Calibration Procedure with Implicit Image Correction.” In Proceedings of IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 1106–12. San Juan, Puerto Rico: IEEE Comput. Soc, 1997. https://doi.org/10.1109/CVPR.1997.609468.

[3] Bouguet, J.Y. “Camera Calibration Toolbox for Matlab”, Computational Vision at the California Institute of Technology.

[4] Bradski, G., and A. Kaehler. Learning OpenCV : Computer Vision with the OpenCV Library. Sebastopol, CA: O'Reilly, 2008.

バージョン履歴

R2014b で導入

すべて展開する