主要内容

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

ステレオビデオからの深度推定

この例では,キャリブレートされたステレオカメラで撮影したビデオに映っている人物を検出し,そのカメラからの距離を判定する方法を説明します。

ステレオカメラのパラメーターの読み込み

stereoParametersオブジェクトを読み込みます。このオブジェクトはstereoCameraCalibratorアプリまたは関数estimateCameraParametersを使用してカメラのキャリブレーションを行った結果です。

加载stereparameters对象。负载(“handshakeStereoParams.mat”);视觉化摄像机外物。showExtrinsics (stereoParams);

ビデオファイルリーダーとビデオプレーヤーの作成

ビデオの読み取りと表示を行う系统对象を作成します。

videoFileLeft =“handshake_left.avi”;videoFileRight =“handshake_right.avi”;readerLeft = VideoReader (videoFileLeft);readerRight = VideoReader (videoFileRight);球员=愿景。放像机(“位置”560年[20200740]);

ビデオフレームの読み取りと平行化

視差を計算して3次元のシーンを再構成するには,左右の各カメラからのフレームを平行化しなければなりません。平行化されたイメージには水平のエピポーラ線があり,行が揃えられています。これにより,ポイントをマッチングする探索空間が1次元に減り,視差の計算が簡略化されます。また,平行化されたイメージはアナグリフに組み合わせて,赤とシアンの立体眼鏡で3次元効果を見ることもできます。

frameLeft = readFrame (readerLeft);frameRight = readFrame (readerRight);[frameLeftRect, frameRightRect] =...rectifyStereoImages (frameLeft frameRight stereoParams);图;imshow (stereoAnaglyph (frameLeftRect frameRightRect));标题(纠正视频帧的);

視差の計算

平行化されたステレオイメージでは,対応するどの点のペアも同じピクセル行に配置されています。左のイメージの各ピクセルにつき,右のイメージで対応するピクセルまでの距離を計算します。この距離は”視差”と呼ばれ,対応するワールド座標点のカメラからの距離に比例しています。

frameLeftGray = rgb2gray (frameLeftRect);frameRightGray = rgb2gray (frameRightRect);disitymap = disityysgm (frameLeftGray, frameRightGray);图;, 64年imshow (disparityMap [0]);标题(“差距地图”);colormap飞机colorbar

3次元シーンの再構成

視差マップからの各ピクセルに対応する点の3次元ワールド座標を再構成します。

points3D = reconstructScene(disparityMap, stereoParams);%转换为米并创建一个pointCloud对象point3d = point3d ./ 1000;ptCloud = pointCloud (points3D,“颜色”, frameLeftRect);创建一个流点云查看器player3D = pcplayer([- 3,3], [- 3,3], [0,8],“VerticalAxis”“y”...“VerticalAxisDir”“下来”);想象点云视图(player3D ptCloud);

左のイメージ内での人物の検出

愿景。PeopleDetectorの系统对象を使用して人物を検出します。

%创建人员检测器对象。限制对象的最小大小%的速度。peopleDetector =愿景。PeopleDetector (“MinSize”83年[166]);%检测人。bboxes = peopleDetector.step (frameLeftGray);

各人物からカメラまでの距離の決定

検出された各人物の重心の3次元ワールド座標を求め,その重心からカメラまでの距離をメートル単位で計算します。

找到被检测到的人的质心。= [round(bboxes(:, 1) + bboxes(:, 3) / 2),...Round (bboxes(:, 2) + bboxes(:, 4) / 2)];找到质心的三维世界坐标。centroidsIdx = sub2ind(size(disparityMap), centroids(:, 2), centroids(:, 1));X = point3d (:,:, 1);Y = point3d (:,:, 2);Z = point3d (:,:, 3);centroids3D = [X (centroidsIdx) ';Y (centroidsIdx) ';Z (centroidsIdx)];求距离摄像机的距离,单位为米。* * * * * * * * * * * * * * * * * *显示检测到的人和他们的距离。标签= cell(1, numel(dists));I = 1:numel(dists)标签{I} = sprintf(“% 0.2 f米”距离(我));结束图;imshow (insertObjectAnnotation (frameLeftRect,“矩形”、bboxes标签);标题(检测到人的);

残りのビデオの処理

上記で説明した,人物を検出してビデオの各フレームにおけるカメラまでの距離を測定する手順を適用します。

hasFrame (readerLeft) & & hasFrame (readerRight)%读取帧。frameLeft = readFrame (readerLeft);frameRight = readFrame (readerRight);%修复帧。[frameLeftRect, frameRightRect] =...rectifyStereoImages (frameLeft frameRight stereoParams);%转换为灰度。frameLeftGray = rgb2gray (frameLeftRect);frameRightGray = rgb2gray (frameRightRect);%计算差异。disitymap = disityysgm (frameLeftGray, frameRightGray);%重建三维场景。points3D = reconstructScene(disparityMap, stereoParams);point3d = point3d ./ 1000;ptCloud = pointCloud (points3D,“颜色”, frameLeftRect);视图(player3D ptCloud);%检测人。bboxes = peopleDetector.step (frameLeftGray);如果~ isempty (bboxes)找到被检测到的人的质心。= [round(bboxes(:, 1) + bboxes(:, 3) / 2),...Round (bboxes(:, 2) + bboxes(:, 4) / 2)];找到质心的三维世界坐标。centroidsIdx = sub2ind(size(disparityMap), centroids(:, 2), centroids(:, 1));X = point3d (:,:, 1);Y = point3d (:,:, 2);Z = point3d (:,:, 3);[X(centroidsIdx), Y(centroidsIdx), Z(centroidsIdx)];求距离摄像机的距离,单位为米。drawtext (sum(entroids3d .^ 2, 2));显示探测到的人和他们的距离。标签= cell(1, numel(dists));I = 1:numel(dists)标签{I} = sprintf(“% 0.2 f米”距离(我));结束dispFrame = insertObjectAnnotation (frameLeftRect,“矩形”bboxes,...标签);其他的dispFrame = frameLeftRect;结束%显示帧。步骤(球员,dispFrame);结束

%清理释放(球员);

まとめ

この例では,キャリブレートされたステレオカメラを使用して,3次元で歩行者の位置を求める方法を説明しました。

参考文献

G. Bradski和A. Kaehler,“学习OpenCV:使用OpenCV库的计算机视觉”,O'Reilly, Sebastopol, CA, 2008。

[2] Dalal, N.和Triggs, B.,面向人类检测的梯度直方图。CVPR 2005。