Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

triangulate

ステレオ イメージでの歪み補正後のマッチする点の 3 次元位置

説明

worldPoints = triangulate(matchedPoints1,matchedPoints2,stereoParams) は、2 つのステレオ イメージから歪み補正されたマッチするイメージ点のペアの 3 次元の位置を返します。

worldPoints = triangulate(matchedPoints1,matchedPoints2,cameraMatrix1,cameraMatrix2) は、ワールド座標系のマッチするペアの 3 次元の位置を返します。これらの位置は、カメラ射影行列によって定義されます。

[worldPoints,reprojectionErrors] = triangulate(___) はさらに、前述の構文のいずれかの入力引数を使用してワールド座標点の再投影誤差を返します。

[worldPoints,reprojectionErrors,validIndex] = triangulate(___) はさらに、有効および無効なワールド座標点のインデックスを返します。有効な点はカメラの前に配置されます。

すべて折りたたむ

ステレオ パラメーターを読み込みます。

load('webcamsSceneReconstruction.mat');

イメージのステレオ ペアを読み取ります。

I1 = imread('sceneReconstructionLeft.jpg');
I2 = imread('sceneReconstructionRight.jpg');

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

I1 = undistortImage(I1,stereoParams.CameraParameters1);
I2 = undistortImage(I2,stereoParams.CameraParameters2);

両方のイメージ内で顔を検出します。

faceDetector = vision.CascadeObjectDetector;
face1 = faceDetector(I1);
face2 = faceDetector(I2);

顔の中心を求めます。

center1 = face1(1:2) + face1(3:4)/2;
center2 = face2(1:2) + face2(3:4)/2;

カメラ 1 から顔までの距離を計算します。

point3d = triangulate(center1, center2, stereoParams);
distanceInMeters = norm(point3d)/1000;

検出した顔と距離を表示します。

distanceAsString = sprintf('%0.2f meters', distanceInMeters);
I1 = insertObjectAnnotation(I1,'rectangle',face1,distanceAsString,'FontSize',18);
I2 = insertObjectAnnotation(I2,'rectangle',face2, distanceAsString,'FontSize',18);
I1 = insertShape(I1,'FilledRectangle',face1);
I2 = insertShape(I2,'FilledRectangle',face2);
 
imshowpair(I1, I2, 'montage');

入力引数

すべて折りたたむ

イメージ 1 の点の座標。M 個の [x y] 座標の M 行 2 列の行列、または KAZEPoints オブジェクト、SURFPoints オブジェクト、MSERRegions オブジェクト、cornerPoints オブジェクト、BRISKPoints オブジェクトとして指定します。matchedPoints1 入力と matchedPoints2 入力には、matchFeatures などの関数を使用してマッチする点が含まれていなければなりません。

イメージ 2 の点の座標。M 個の [x y] 座標の M 行 2 列の行列、または KAZEPoints オブジェクト、SURFPoints オブジェクト、MSERRegions オブジェクト、cornerPoints オブジェクト、BRISKPoints オブジェクトとして指定します。matchedPoints1 入力と matchedPoints2 入力には、matchFeatures などの関数を使用してマッチする点が含まれていなければなりません。

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

stereoParameters オブジェクトを関数に渡す場合、ワールド座標系の原点はカメラ 1 の光学的中心に設定されます。x 軸はカメラから右方向に、y 軸はカメラから下方向に、z 軸はカメラから遠ざかる方向に向いています。

カメラ 1 の射影行列。4 行 3 列の行列として指定します。この行列は、同次座標の 3 次元点をカメラからのイメージの対応する点にマッピングします。この入力は、ワールド座標系のカメラ 1 の位置と向きを示します。cameraMatrix1 は、実数および非スパースの数値行列でなければなりません。このカメラ行列は関数 cameraMatrix を使用して取得できます。

関数に渡されるカメラ行列は、ワールド座標系を定義します。

カメラ 2 の射影行列。4 行 3 列の行列として指定します。この行列は、同次座標の 3 次元点をカメラからのイメージの対応する点にマッピングします。この入力は、ワールド座標系のカメラ 2 の位置と向きを示します。cameraMatrix2 は、実数および非スパースの数値行列でなければなりません。このカメラ行列は関数 cameraMatrix を使用して取得できます。

関数に渡されるカメラ行列は、ワールド座標系を定義します。

出力引数

すべて折りたたむ

歪み補正後のイメージ点のマッチするペアの 3 次元位置。M 行 3 列の行列として返されます。この行列には、2 つのステレオ イメージからの歪み補正後のマッチするイメージ点のペアの [x y z] 位置が M 個含まれます。

stereoParams を使用してカメラのジオメトリを指定すると、ワールド座標点の座標はカメラ 1 の光学中心からの相対的な位置を示します。

cameraMatrix1cameraMatrix2 を使用してカメラのジオメトリを指定すると、ワールド座標点の座標がカメラ行列によって定義されます。

matchedPoints1matchedPoints2 のデータ型が double の場合、関数は worldPoints をデータ型 double として返します。それ以外の場合は worldPoints をデータ型 single として返します。

データ型: single | double

再投影誤差。M 行 1 列のベクトルとして返されます。関数は、各ワールド座標点を両方のイメージに投影します。その後、各イメージで検出された点と再投影された点の間の距離として、再投影誤差を計算します。reprojectionErrors ベクトルには、各ワールド座標点の平均再投影誤差が含まれます。

ワールド座標点の有効性。M 行 1 列の logical ベクトルとして返されます。logical 1 (true) として示される有効な点は、カメラの前に配置されます。logical 0 (false) として示される無効な点は、カメラの後ろに配置されます。

カメラの位置に関するワールド座標点の有効性は、カメラ行列と同次座標を使用してイメージにワールド座標点を投影することによって決定されます。結果のスケール係数が正の場合、ワールド座標点は有効です。

ヒント

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

参照

[1] Hartley, R. and A. Zisserman. "Multiple View Geometry in Computer Vision." Cambridge University Press, p. 312, 2003.

拡張機能

R2014b で導入