主要内容

深度估计从立体视频

这个例子展示了如何检测与校准立体摄像机拍摄的视频和确定摄像机的距离。

负载立体相机的参数

加载stereoParameters对象,该对象的结果校准相机使用stereoCameraCalibrator应用程序或estimateCameraParameters函数。

%加载stereoParameters对象。负载(“handshakeStereoParams.mat”);%可视化相机外在。showExtrinsics (stereoParams);

图包含一个坐标轴对象。坐标轴对象与标题外在参数可视化,包含X(毫米),ylabel Z (mm)包含32块类型的对象,文本行。

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

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

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

阅读和纠正视频帧

左派和右派摄像机的帧必须纠正为了计算差异和重建三维场景。纠正图像水平纵向线条,row-aligned。这简化了计算的差异通过减少搜索空间一维匹配点。纠正图像也可以组合成一个浮雕,它可以使用立体red-cyan眼镜看到3 d的效果。

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

图包含一个坐标轴对象。坐标轴对象与标题纠正视频帧包含一个类型的对象的形象。

计算差异

在纠正任何一对立体图像对应点位于同一像素行。为左图像中的每个像素计算距离对应的像素的图像。这个距离叫做差距,它正比于对应的世界的距离点的相机。

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

图包含一个坐标轴对象。坐标轴对象与标题差距图包含一个类型的对象的形象。

重建三维场景

重建的三维世界坐标点对应于每个像素的差距地图。

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

图点云播放器包含一个坐标轴对象。坐标轴对象包含X, Y ylabel包含一个散射类型的对象。

检测人在左边的形象

使用vision.PeopleDetector系统对象检测人。

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

确定每个人的距离相机

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

%的质心检测到人。质心=[圆(bboxes (: 1) + bboxes (:, 3) / 2),轮(bboxes (:, 2) + bboxes (:, 4) / 2)];%找到质心的三维世界坐标。centroidsIdx = sub2ind(大小(disparityMap),重心(:,2),重心(:1));X = points3D (:,: 1);Y = points3D (:: 2);Z = points3D (:,:, 3);centroids3D = [X (centroidsIdx) ';Y (centroidsIdx) ';Z (centroidsIdx)];%在米找到距离相机。dist =√总和(centroids3D ^ 2));%显示检测到的人民和他们的距离。标签=细胞(1,元素个数(经销));i = 1:元素个数(经销)标签{我}= 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 = im2gray (frameLeftRect);frameRightGray = im2gray (frameRightRect);%计算差异。disparityMap = disparitySGM (frameLeftGray frameRightGray);%重建三维场景。points3D = reconstructScene (disparityMap reprojectionMatrix);points3D = points3D。/ 1000;ptCloud = pointCloud (points3D,“颜色”,frameLeftRect);视图(player3D ptCloud);%检测人。bboxes = peopleDetector.step (frameLeftGray);如果~ isempty (bboxes)%的质心检测到人。质心=[圆(bboxes (: 1) + bboxes (:, 3) / 2),轮(bboxes (:, 2) + bboxes (:, 4) / 2)];%找到质心的三维世界坐标。centroidsIdx = sub2ind(大小(disparityMap),重心(:,2),重心(:1));X = points3D (:,: 1);Y = points3D (:: 2);Z = points3D (:,:, 3);centroids3D = [X (centroidsIdx), Y (centroidsIdx)、Z (centroidsIdx)];%在米找到距离相机。dist =√sum (centroids3D。^ 2, 2));%显示检测到的人民和他们的距离。标签=细胞(1,元素个数(经销));i = 1:元素个数(经销)标签{我}= sprintf (“% 0.2 f米”距离(我));结束dispFrame = insertObjectAnnotation (frameLeftRect,“矩形”bboxes,标签);其他的dispFrame = frameLeftRect;结束%显示帧。步骤(球员,dispFrame);结束

图点云播放器包含一个坐标轴对象。坐标轴对象包含X, Y ylabel包含一个散射类型的对象。

%清理释放(球员);

数字视频播放器包含一个坐标轴对象和其他对象类型的uiflowcontainer, uimenu uitoolbar。坐标轴对象包含一个类型的对象的形象。

总结

这个例子展示了如何本地化行人使用校准3 d立体相机。

引用

[1]g . Bradski和a . Kaehler”学习OpenCV: OpenCV的计算机视觉库,”O ' reilly,塞瓦斯托波尔,CA, 2008。

[2]Dalal:组织,B。,Histograms of Oriented Gradients for Human Detection. CVPR 2005.