深度估计从立体视频
这个例子展示了如何检测与校准立体摄像机拍摄的视频和确定摄像机的距离。
负载立体相机的参数
加载stereoParameters
对象,该对象的结果校准相机使用stereoCameraCalibrator
应用程序或estimateCameraParameters
函数。
%加载stereoParameters对象。负载(“handshakeStereoParams.mat”);%可视化相机外在。showExtrinsics (stereoParams);
创建视频文件读者和视频播放器
创建系统对象用于读取和显示视频。
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 = rgb2gray (frameLeftRect);frameRightGray = rgb2gray (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);
检测人在左边的形象
使用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 = rgb2gray (frameLeftRect);frameRightGray = rgb2gray (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);结束
%清理释放(球员);
总结
这个例子展示了如何本地化行人使用校准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.