主要内容

单眼视觉测程法

视觉里程计是一个过程,确定摄像机的位置和方向进行分析的序列图像。视觉测程法被用于各种各样的应用程序,如移动机器人,自动驾驶汽车,无人飞行器。这个例子向您展示了如何估算一个校准相机的轨迹从一个图像序列。

概述

这个例子展示了如何评估校准相机的轨迹从一系列的二维视图。这个示例使用新筑波立体图像数据集在筑波大学CVLAB创建的。(https://cvlab.cs.tsukuba.ac.jp)。数据集由合成图像,使用计算机图形生成,包括地面真理相机的姿势。

没有额外的信息,单眼相机的轨迹只能恢复到一个未知的比例因子。单目视觉测距系统通常用于移动机器人或自动车辆获得比例因子从另一个传感器(如轮里程表或GPS),或从一个已知大小的一个对象的场景。这个例子计算比例因子从地面真理。

例子是分为三个部分:

  1. 估计第二种观点构成的相对于第一个视图。估计第二种观点的姿势估计基本矩阵分解成相机的位置和方向。

  2. 使用全球束调整引导估计相机轨迹。使用纵向约束消除异常值。找到3 d-to-2d对应点之间的三角前两个观点和当前视图。计算世界照相机构成当前视图的解决perspective-n-point (PnP)问题。错误估计相机带来不可避免的结果,随着时间的积累。这种效应被称为的漂移。减少漂移,改进的示例使用束调整姿势估计到目前为止。

  3. 使用窗口的束调整估算剩余相机轨迹。随着每一个新的视图的时间完善所有姿势也在不断增加。窗口的束调整是一种减少计算时间只优化n的观点,而不是整个轨迹。计算时间进一步减少不调用包调整为每个视图。

读取输入图像序列和地面真理

这个示例使用的图片筑波音响的新数据集筑波大学CVLAB创建。如果你使用这些图片在您自己的工作或出版物,请把以下文件:

[1]马丁·珀里斯Martorell,莎拉•Martull Atsuto Maki Yasuhiro Ohkawa, Kazuhiro福井,“向仿真驱动的立体视觉系统”。学报ICPR pp.1038 - 1042, 2012。

[2]莎拉Martull马丁·珀里斯Martorell, Kazuhiro福井,“现实的CG立体图像数据集与地面真理差距地图”,学报ICPR车间TrakMark2012、pp.40-42, 2012年。

图像= imageDatastore (fullfile (toolboxdir (“愿景”),“visiondata”,“NewTsukuba”));%负载地面实况相机姿势。负载(“visualOdometryGroundTruth.mat”)

创建一个视图包含序列的第一个观点

使用一个imageviewset对象来存储和管理图像点和相机的姿势与每个视图,以及之间的匹配对观点。一旦你填充一个imageviewset对象,您可以使用它来找到跟踪多个观点和检索相机使用triangulateMultiviewbundleAdjustment功能。

%创建一个空imageviewset对象管理与每个视图关联的数据。vSet = imageviewset;%第一图像读取和显示。Irgb = readimage(图片1);球员=愿景。放像机(位置= [400、650、510]);步骤(球员,Irgb);

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

%的相机使用相机intrinsic intrinsic对象创建%筑波的新数据集。focalLength = (615 - 615);%以像素为单位指定principalPoint = (320 - 240);%的像素(x, y)图象尺寸大小= (Irgb [1, 2]);%在像素(mrows, ncols)intrinsic = cameraIntrinsics (focalLength principalPoint图象尺寸);

转换为灰度和undistort。在这个例子中,undistortion没有影响,因为图像合成,没有透镜畸变。然而,对于真正的图片,undistortion是必要的。

prevI = undistortImage (im2gray (Irgb), intrinsic);%检测功能。prevPoints = detectSURFFeatures (prevI MetricThreshold = 500);%选择特性的一个子集,均匀分布在整个图像。numPoints = 200;prevPoints = selectUniform (prevPoints numPoints、大小(prevI));%提取特征。使用“正直”特性提高匹配质量%摄像机运动涉及很少或没有平面旋转。prevFeatures = extractFeatures (prevI prevPoints,直立= true);%添加第一个视图。与第一个视图相关联的摄像机%在原点,面向沿z轴。viewId = 1;vSet = addView (vSet viewId rigidtform3d(眼(3),[0 0 0]),点= prevPoints);

情节初始相机带来

创建两个图形相机对象代表估计和实际相机提出了基于地面真理筑波的新数据集的数据。

%设置坐标轴。图轴([-220,-140,-50,300]);%设置轴是垂直向下。甘氨胆酸视图(3);集(gca, CameraUpVector = (0,1,0));甘氨胆酸camorbit (-120 0, data = (0,1,0));网格包含(“X (cm)”);ylabel (“Y (cm)”);zlabel (“Z (cm)”);持有%情节估计相机姿势。cameraSize = 7;camPose =姿势(vSet);camEstimated = plotCamera (camPose、大小= cameraSize,颜色=“g”,透明度= 0);%情节实际相机姿势。= cameraSize camActual = plotCamera(大小,AbsolutePose = rigidtform3d (groundTruthPoses.Orientation {1}”,groundTruthPoses.Location {1}),颜色=“b”,透明度= 0);%初始化相机轨迹。trajectoryEstimated = plot3 (0, 0, 0,“g -”);trajectoryActual = plot3 (0, 0, 0,“b -”);传奇(“估计轨迹”,“实际轨迹”);标题(“相机轨迹”);

估计第二种观点的姿势

从第二种观点检测和提取特征,匹配第一个视图使用helperDetectAndMatchFeatures。估计的构成相对于第一个视图使用第二种观点helperEstimateRelativePose,并将其添加到imageviewset

%读取和显示图像。viewId = 2;Irgb = readimage(图像、viewId);步骤(球员,Irgb);

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

%转换为灰度和undistort。我= undistortImage (im2gray (Irgb), intrinsic);%前面和当前图像之间的匹配特性。[currPoints, currFeatures indexPairs] = helperDetectAndMatchFeatures (prevFeatures,我);%估计当前视图的构成相对于前面的视图。[relPose, inlierIdx] = helperEstimateRelativePose (prevPoints (indexPairs (: 1)), currPoints (indexPairs (:, 2)), intrinsic);%排除纵向离群值。indexPairs = indexPairs (inlierIdx:);%设置当前视图添加到视图。vSet = addView (vSet viewId relPose,分= currPoints);%之前存储之间的匹配点和当前视图。vSet = addConnection (vSet viewId-1 viewId,匹配= indexPairs);

第二个视图的位置相对于第一个视图只能恢复到一个未知的比例因子。使用计算比例因子从地面真理helperNormalizeViewSet模拟外部传感器,将使用在一个典型的单目视觉测距系统。

vSet = helperNormalizeViewSet (vSet groundTruthPoses);

更新相机轨迹图使用helperUpdateCameraPlotshelperUpdateCameraTrajectories

helperUpdateCameraPlots (viewId camEstimated camActual,姿势(vSet),groundTruthPoses);helperUpdateCameraTrajectories (viewId trajectoryEstimated trajectoryActual,姿势(vSet) groundTruthPoses);

prevI =我;prevFeatures = currFeatures;prevPoints = currPoints;

使用全球束调整引导估计相机轨迹

找到3 d-to-2d通讯世界点之间较前两种观点分析和图像从目前的观点。使用helperFindEpipolarInliers找到满足纵向约束的匹配,然后使用helperFind3Dto2DCorrespondences满足三维点较前两种观点并找到相应的二维点在当前视图。

计算世界照相机构成当前视图的解决perspective-n-point (PnP)使用问题estworldpose。第一15视图,使用全局包调整完善整个轨迹。使用全球有限数量的束调整视图接连估计剩下的相机轨迹,它并不昂贵。

viewId = 3:15%读取和显示未来的形象Irgb = readimage(图像、viewId);步骤(球员,Irgb);%转换为灰度和undistort。我= undistortImage (im2gray (Irgb), intrinsic);%以往和当前图像之间的匹配点。[currPoints, currFeatures indexPairs] = helperDetectAndMatchFeatures (prevFeatures,我);%消除异常值的特征匹配。[~,inlierIdx] = helperEstimateRelativePose (prevPoints (indexPairs (: 1)),currPoints (indexPairs (:, 2)), intrinsic);indexPairs = indexPairs (inlierIdx:);%满足分前两个观点,和发现%在当前视图对应点。[worldPoints, imagePoints] = helperFind3Dto2DCorrespondences (vSet,intrinsic、indexPairs currPoints);%因为RANSAC包括一个随机过程,它可能有时不是%达到所需的信心水平和超过最大数量的%试验。禁用警告当以来发生的结果%仍然有效。warningstate =警告(“关闭”,“愿景:ransac: maxTrialsReached”);%估计世界相机姿势当前视图。absPose = estworldpose (imagePoints、worldPoints intrinsic);%恢复原始警告状态警告(warningstate)%设置当前视图添加到视图。vSet = addView (vSet viewId absPose,分= currPoints);%之前存储之间的匹配点和当前视图。vSet = addConnection (vSet viewId-1 viewId,匹配= indexPairs);跟踪= findTracks (vSet);%找到点跟踪生成多个视图。坎波斯=姿势(vSet);%获得所有视图的相机姿势。%满足初始点位置的3 d世界。xyzPoints = triangulateMultiview(追踪,坎波斯,intrinsic);%改进相机使用束调整姿势。(~,campos) = bundleAdjustment (xyzPoints,跟踪,坎波斯,intrinsic PointsUndistorted = true, AbsoluteTolerance e-12 = 1,RelativeTolerance = 1 e-12 MaxIterations = 200, FixedViewID = 1);vSet = updateView (vSet campos);%更新视图组。%束调整可以移动整个相机。规范化的%视图设置为第一个相机在原点沿% z轴和调整的规模相匹配,地面真理。vSet = helperNormalizeViewSet (vSet groundTruthPoses);%更新相机轨迹图。helperUpdateCameraPlots (viewId camEstimated camActual,姿势(vSet),groundTruthPoses);helperUpdateCameraTrajectories (viewId trajectoryEstimated,trajectoryActual,姿势(vSet) groundTruthPoses);prevI =我;prevFeatures = currFeatures;prevPoints = currPoints;结束

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

估计剩余使用窗口的束调整相机轨迹

估计剩下的相机轨迹通过窗口的包只调整完善过去15视图,以限制的数量计算。此外,包调整不需要呼吁每个视图,因为estworldpose计算同一单位的构成三维点。本节束调整呼吁每7日视图。调整窗口大小和频率的要求包选择实验。

viewId = 16:元素个数(images.Files)%读取和显示未来的形象Irgb = readimage(图像、viewId);步骤(球员,Irgb);%转换为灰度和undistort。我= undistortImage (im2gray (Irgb), intrinsic);%以往和当前图像之间的匹配点。[currPoints, currFeatures indexPairs] = helperDetectAndMatchFeatures (prevFeatures,我);%满足分前两个观点,和发现%在当前视图对应点。[worldPoints, imagePoints] = helperFind3Dto2DCorrespondences (vSet,intrinsic、indexPairs currPoints);%因为RANSAC包括一个随机过程,它可能有时不是%达到所需的信心水平和超过最大数量的%试验。禁用警告当以来发生的结果%仍然有效。warningstate =警告(“关闭”,“愿景:ransac: maxTrialsReached”);%估计世界相机姿势当前视图。absPose = estworldpose (imagePoints、worldPoints intrinsic);%恢复原始警告状态警告(warningstate)%将当前视图和连接添加到视图集。vSet = addView (vSet viewId absPose,分= currPoints);vSet = addConnection (vSet viewId-1 viewId,匹配= indexPairs);%改进估计相机使用窗口的束调整姿势。运行%优化每7日视图。如果国防部(viewId 7) = = 0%找到跟踪在过去15观点和满足。windowSize = 15;startFrame = max (1, viewId - windowSize);跟踪= findTracks (vSet startFrame: viewId);坎波斯=姿势(vSet startFrame: viewId);[xyzPoints, reprojErrors] = triangulateMultiview(追踪,坎波斯,intrinsic);%的前两个姿势固定,保持相同的规模。fixedIds = [startFrame startFrame + 1];%排除分和高reprojection跟踪错误。idx = reprojErrors < 2;(~,campos) = bundleAdjustment (xyzPoints (idx:),追踪(idx),坎波斯,intrinsic FixedViewIDs = fixedIds,PointsUndistorted = true, AbsoluteTolerance e-12 = 1,RelativeTolerance = 1 e-12 MaxIterations = 200);vSet = updateView (vSet campos);%更新视图组。结束%更新相机轨迹图。helperUpdateCameraPlots (viewId camEstimated camActual,姿势(vSet),groundTruthPoses);helperUpdateCameraTrajectories (viewId trajectoryEstimated,trajectoryActual,姿势(vSet) groundTruthPoses);prevI =我;prevFeatures = currFeatures;prevPoints = currPoints;结束

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

持有

总结

这个例子展示了如何评估校准单眼相机的轨迹从一个序列的观点。注意,估计地面轨迹不完全匹配的真理。尽管非线性优化相机姿势,相机姿势估计错误积累,导致漂移。在视觉测距系统这个问题通常是由来自多个传感器的信息融合,并通过执行循环关闭。

引用

[1]马丁·珀里斯Martorell,莎拉•Martull Atsuto Maki Yasuhiro Ohkawa, Kazuhiro福井,“向仿真驱动的立体视觉系统”。学报ICPR pp.1038 - 1042, 2012。

[2]莎拉Martull马丁·珀里斯Martorell, Kazuhiro福井,“现实的CG立体图像数据集与地面真理差距地图”,学报ICPR车间TrakMark2012、pp.40-42, 2012年。

[3]M.I.A. Lourakis和嗜Argyros (2009)。SBA:一个软件包为通用稀疏捆调整”。ACM交易数学软件(ACM) 36(1):行。

[4]r·哈特利a . Zisserman“计算机视觉中的多视图几何,”剑桥大学出版社,2003年。

[5]b区格;p . McLauchlan;r·哈特利;菲茨吉本(1999)。“束调整:现代合成”。《国际研讨会上视觉算法。斯普林格出版社。298 - 372页。

[6]X.-S。高,X.-R。侯,j . Tang和H.-F。程”,完整的解决方案分类Perspective-Three-Point问题、“IEEE反式。模式分析与机器智能,25卷,没有。8,930 - 943年,2003页。