主要内容

立体视频深度估计

此示例显示如何检测使用校准立体声相机拍摄的视频中的人员,并从相机确定其距离。

加载立体相机的参数

加载立体塔纳米仪对象,它是使用stereoCameraCalibrator应用程序或者estimateCameraParameters函数。

%加载stereparameters对象。负载('handshakesteoparams.mat');%可视化相机外在。showExtrinsics (stereoParams);

图中包含一个轴。以“外部参数可视化”为标题的坐标轴包含32个补丁、文本、线类型的对象。

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

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

videoFileLeft =“handshake_left.avi”;videoFileRight ='handshake_right.avi';ReaderLeft = Videoreader(VideoFileLeft);Readerright = Videoreader(VideoFileright);玩家= Vision.videoplayer('位置'560年[20200740]);

阅读和纠正视频帧

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

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飞机彩色栏

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

重建三维场景

重建与视差图的每个像素对应的点的三维世界坐标。

points3D = reconstructScene(disparityMap, stereoParams);%转换为米并创建一个pointCloud对象点3d = point3d ./ 1000;ptcloud = pointcloud(point3d,'颜色', frameLeftRect);%创建流云云查看器Player3d = PCPlayer([ -  3,3],[-3,3],[0,8],'verticalaxis','是',“VerticalAxisDir”,'下');%可视化点云视图(player3D ptCloud);

数字云播放器包含轴。轴包含类型散射的对象。

检测人在左边的图像

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

%创建人员探测器对象。限制最小对象大小% 速度。Peopledetector = Vision.peopledetector(“MinSize”,[166 83]);%探测人。bboxes = peopledetector.step(frameleftgray);

确定每个人到相机的距离

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

%找到了检测到的人的质心。Centroids = [round(bboxes(:, 1)+ bboxes(:,3)/ 2),圆形(Bboxes(:,2)+ Bboxes(:,4)/ 2)];%找到质心的三维世界坐标。centroidsIdx = sub2ind(size(disparityMap), centroids(:, 2), centroids(:, 1));X = pointts3d (:,:, 1);Y = pointts3d (:,:, 2);Z = pointts3d (:,:, 3);centroids3d = [x(centroidsidx)';Y(Centroidsidx)';z(centroidsidx)'];%求出距离相机的距离,单位为米。dists = sqrt(总和(Centroids3d。^ 2));%显示检测到的人和他们的距离。标签= cell(1, numel(专科));I = 1:numel(医师)标签{I} = sprintf(医师)“% 0.2 f米”,dists(i));结束图;imshow (insertObjectAnnotation (frameLeftRect,'长方形',bboxes,标签));标题(检测到人的);

图中包含一个轴。标题为“Detected People”的轴包含类型为图像的对象。

处理剩下的视频

应用上述步骤以检测人们并在视频的每一帧中对相机测量它们的距离。

尽管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);点3d = point3d ./ 1000;ptcloud = pointcloud(point3d,'颜色', frameLeftRect);视图(player3D ptCloud);%探测人。bboxes = peopledetector.step(frameleftgray);如果~ isempty (bboxes)%找到了检测到的人的质心。Centroids = [round(bboxes(:, 1)+ bboxes(:,3)/ 2),圆形(Bboxes(:,2)+ Bboxes(:,4)/ 2)];%找到质心的三维世界坐标。centroidsIdx = sub2ind(size(disparityMap), centroids(:, 2), centroids(:, 1));X = pointts3d (:,:, 1);Y = pointts3d (:,:, 2);Z = pointts3d (:,:, 3);centroids3D = [X(centroidsIdx), Y(centroidsIdx), Z(centroidsIdx)];%求出距离相机的距离,单位为米。sqrt(sum(centroids3D .^ 2, 2));%显示检测人员和他们的距离。标签= cell(1, numel(专科));I = 1:numel(医师)标签{I} = sprintf(医师)“% 0.2 f米”,dists(i));结束dispframe = InsertObjectAnnotation(FrameLeftrect,'长方形'bboxes,标签);其他的dispframe = frameftrect;结束%显示帧。步骤(球员,dispFrame);结束

数字云播放器包含轴。轴包含类型散射的对象。

图中包含一个轴。标题为“Detected People”的轴包含类型为图像的对象。

% 清理发布(播放器);

图象视频播放器包含UiflowContainer,Uimenu,UIToolbar类型的轴和其他对象。轴包含类型图像的对象。

概括

此示例显示了如何使用校准的立体声相机在3-D中本地化行人。

参考

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

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