主要内容

立体声视频深度估计

这个例子显示了如何检测视频的人校准立体相机拍摄,并确定从相机的距离。

加载立体相机的参数

加载stereoParameters对象,这是校准相机使用或stereoCameraCalibrator应用程序或estimateCameraParameters函数。

加载stereparameters对象。负载('handshakeStereoParams.mat');%可视化相机外部参数。showExtrinsics (stereoParams);

图中包含一个轴对象。标题为“外部参数可视化”的axis对象包含32个类型为patch、text、line的对象。

创建视频文件阅读器和视频播放器

创建用于读取和显示视频的系统对象。

videoFileLeft =“handshake_left.avi”;videoFileRight ='handshake_right.avi';readerLeft = VideoReader(videoFileLeft);readerRight = VideoReader(videoFileRight);玩家= vision.VideoPlayer('位置'560年[20200740]);

读取和修复视频帧

为了计算视差和重建三维场景,必须对左右摄像机的帧进行校正。校正后的图像具有水平极线,并行对齐。通过将匹配点的搜索空间缩小到一维,简化了视差的计算。矫正后的图像也可以组合成一个浮雕,可以使用立体红青色眼镜观看,以获得三维效果。

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);图;imshow(disparityMap,[0,64]);标题(“差距地图”);colormap飞机彩条

图中包含一个轴对象。与标题视差图中的轴对象包含类型图像的对象。

重建三维场景

重建对应于从视差图中的每个像素点的3-d世界坐标。

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

图中的点云播放器包含一个轴对象。轴对象包含类型分散的对象。

检测左侧图像中的人

使用愿景。PeopleDetector用于检测人的系统对象。

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

确定每个人的距离相机

找到每个被检测人质心的三维世界坐标,并计算质心到摄像机的距离,单位为米。

%查找检测人的重心。质心= [轮(bboxes(:,1)+ bboxes(:,3)/ 2),...轮(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)'];求距离摄像机的距离,单位为米。dists中= SQRT(总和(centroids3D ^ 2));显示检测到的人和他们的距离。标签= cell(1, numel(dists));I = 1:numel(dists)标签{I} = sprintf(“% 0.2 f米”,dists中(I));结束图;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);%重构3-d的场景。points3D = reconstructScene(disparityMap, stereoParams);points3D = points3D ./ 1000;ptCloud =点云(points3D,'颜色', frameLeftRect);视图(player3D ptCloud);%检测的人。bboxes = peopleDetector.step(frameLeftGray);如果~ isempty (bboxes)%查找检测人的重心。质心= [轮(bboxes(:,1)+ bboxes(:,3)/ 2),...轮(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米”,dists中(I));结束dispFrame = insertObjectAnnotation(frameLeftRect,'长方形',bboxes,...标签);别的dispFrame = frameLeftRect;结束%显示帧。步骤(球员,dispFrame);结束

图中的点云播放器包含一个轴对象。轴对象包含类型分散的对象。

图中包含一个轴对象。与标题检测的人的轴对象包含类型图像的对象。

图中包含一个轴对象。与标题视差图中的轴对象包含类型图像的对象。

% 清理释放(播放器);

图视频播放器包含一个轴对象和类型uiflowcontainer,uimenu,uitoolbar的其他对象。轴对象包含类型图像的对象。

概括

此实施例表明如何使用校准的立体相机来本地化行人3- d。

参考

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

[2]达拉尔,N。和Triggs,B.,对于人体检测方向梯度直方图。CVPR 2005年。