主要内容

结构从运动从两个视图

运动结构(SfM)是从一组二维图像中估计场景的三维结构的过程。这个示例向您展示了如何从两张图像估计校准相机的姿态,重建场景的3-D结构,直到一个未知的比例因子,然后通过检测一个已知大小的物体来恢复实际的比例因子。

概述

此示例演示如何从使用校准的相机拍摄的一对2-D图像重建3-D场景相机校准器该算法由以下步骤组成:

  1. 匹配两个图像之间的稀疏点集。有多种方法可以找到两个图像之间的点对应关系。方法检测第一个图像中的角detectMinEigenFeatures函数,并跟踪它们到第二个图像使用愿景。PointTracker.或者你可以使用extractFeatures紧随其后的是matchFeatures

  2. 估计基本矩阵使用estimateEssentialMatrix

  3. 计算相机的运动使用relativeCameraPose函数。

  4. 在两幅图像之间匹配密集的点集。重新检测点使用detectMinEigenFeatures减少了“MinQuality”为了得到更多的分数。然后跟踪密集点到第二图像使用愿景。PointTracker

  5. 用确定匹配点的三维位置由三角形组成的

  6. 探测一个已知大小的物体。在这个场景中,有一个半径为10厘米的地球仪。使用pcfitsphere在点云中找到地球。

  7. 恢复实际尺度,从而进行度量重建。

读一对图像

将一对图像加载到工作区中。

imageDir = fullfile(toolboxdir(“愿景”),“visiondata”“upToScaleReconstructionImages”);images = imageDatastore(imageDir);I1 = readimage(images, 1);I2 = readimage(images, 2);图imshowpair(I1, I2,“蒙太奇”);标题(原始图像的);

图中包含一个轴对象。标题为Original Images的axes对象包含一个image类型的对象。

摄像机参数

方法计算的相机参数相机校准器参数存储在cameraParams对象,并包括相机的本征和镜头畸变系数。

载入预先计算的相机参数负载upToScaleReconstructionCameraParameters.mat

消除镜头失真

透镜畸变会影响最终重建的精度。方法可以从每个图像中删除失真undistortImage函数。这一过程使因透镜径向畸变而弯曲的线条变直。

I1 = undistortion timage (I1, cameraParams);I2 = undistortion timage (I2, cameraParams);图imshowpair(I1, I2,“蒙太奇”);标题(“无畸变的图像”);

图中包含一个轴对象。标题为undistortion Images的axes对象包含一个image类型的对象。

寻找图像之间的点对应关系

发现好的特性并进行跟踪。减少“MinQuality”为了检测更少的点,这些点将更均匀地分布在整个图像中。如果摄像机的运动不是很大,那么使用KLT算法跟踪是建立点对应关系的好方法。

检测特征点imagePoints1 = detectMinEigenFeatures(im2gray(I1),“MinQuality”, 0.1);%可视化检测点图imshow (I1,“InitialMagnification”, 50);标题(“第一张图中最强的150个角”);持有情节(selectStrongest (imagePoints1, 150));

图中包含一个轴对象。标题为150最强角的坐标轴对象包含2个Image、line类型的对象。

创建点跟踪器追踪者=视觉。PointTracker (“MaxBidirectionalError”, 1“NumPyramidLevels”5);初始化点跟踪器imagePoints1 = imagePoints1. location;初始化(跟踪器,imagePoints1, I1);%追踪点数[imagePoints2, validIdx] = step(跟踪器,I2);matchedPoints1 = imagePoints1(validIdx,:);matchedPoints2 = imagePoints2(validIdx,:);可视化通信图showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2);标题(“跟踪特性”);

图中包含一个轴对象。标题为Tracked Features的axes对象包含4个对象,类型为image、line。

估计基本矩阵

使用estimateEssentialMatrix函数来计算基本矩阵并找到满足极坐标约束的内线点。

估计基本矩阵[E, eppolarinliers] = estimateEssentialMatrix(...matchedPoints1, matchedPoints2, cameraParams,“信心”, 99.99);找到极内线inlierPoints1 = matchedPoints1(epipolarInliers,:);inlierPoints2 = matchedPoints2(epipolarInliers,:);显示更深层次的匹配图showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2);标题(“纵向窗”);

图中包含一个轴对象。标题为Epipolar Inliers的坐标轴对象包含4个类型为image、line的对象。

计算相机姿势

计算第二个摄像头相对于第一个摄像头的位置和方向。请注意,t是平移单位向量,因为平移只能按比例计算。

[orient, loc] = relativeCameraPose(E, cameraParams, inlierPoints1, inlierPoints2);

重建匹配点的三维位置

重新检测点在第一个图像使用lower“MinQuality”为了得到更多的分数。跟踪第二个图像中的新点。方法估计匹配点对应的三维位置由三角形组成的函数,实现直接线性变换(DLT)算法[1]。将原点放在相机的光学中心,与第一张图像相对应。

检测密集特征点。使用ROI来排除靠近的点%图像边缘。roi = [30,30, size(I1, 2) - 30, size(I1, 1) - 30];imagePoints1 = detectMinEigenFeatures(im2gray(I1),“投资回报”投资回报率,...“MinQuality”, 0.001);创建点跟踪器追踪者=视觉。PointTracker (“MaxBidirectionalError”, 1“NumPyramidLevels”5);初始化点跟踪器imagePoints1 = imagePoints1. location;初始化(跟踪器,imagePoints1, I1);%追踪点数[imagePoints2, validIdx] = step(跟踪器,I2);matchedPoints1 = imagePoints1(validIdx,:);matchedPoints2 = imagePoints2(validIdx,:);为相机的每个位置计算相机矩阵第一个摄像机位于原点,沿z轴观察。。因此,其%变换就是单位单位。Tform1 = rigid3d;camMatrix1 = cameraMatrix(cameraParams, tform1);计算第二个摄像头的外部参数cameraPose = rigid3d(orient, loc);tform2 = cameraPoseToExtrinsics(cameraPose);camMatrix2 = cameraMatrix(cameraParams, tform2);计算三维点points3D =三角化(matchedPoints1, matchedPoints2, camMatrix1, camMatrix2);得到每个重构点的颜色numPixels = size(i1,1) * size(i1,2);allColors =重塑(I1, [numPixels, 3]);colorIdx = sub2ind([size(I1, 1), size(I1, 2)], round(matchedPoints1(:,2)),...轮(matchedPoints1 (: 1)));color = allColors(colorIdx,:);创建点云ptCloud = pointCloud(points3D,“颜色”、颜色);

显示三维点云

使用plotCamera函数可视化摄像机的位置和方向,以及pcshow函数来可视化点云。

可视化相机的位置和方向cameraSize = 0.3;图plotCamera (“大小”cameraSize,“颜色”“r”“标签”' 1 '“不透明度”, 0);持有网格plotCamera (“位置”疯狂的,“定位”东方,“大小”cameraSize,...“颜色”“b”“标签”' 2 '“不透明度”, 0);可视化点云pcshow (ptCloud“VerticalAxis”“y”“VerticalAxisDir”“下来”...“MarkerSize”, 45岁);%旋转和缩放绘图camorbit (0, -30);camzoom (1.5);标记坐标轴包含(“轴”);ylabel (“轴”);zlabel (z轴的)标题(“按比例重建现场”);

图中包含一个轴对象。标题为Up to Scale Reconstruction of The Scene的坐标轴对象包含行、文本、补丁、散点类型的21个对象。

在点云上放置一个球体来找到地球

方法将球体与3-D点拟合,从而在点云中找到球体pcfitsphere函数。

%探测地球仪globe = pcfitsphere(ptCloud, 0.1);显示地球表面情节(全球);标题(“地球的估计位置和大小”);持有

图中包含一个轴对象。标题为Estimated Location and Size of The Globe的坐标轴对象包含22个对象,类型包括行、文本、补丁、散射和表面。

场景的度量重建

地球的实际半径是10厘米。现在可以确定3-D点的坐标,单位是厘米。

确定比例因子scaleFactor = 10 / global . radius;缩放点云ptCloud = pointCloud(points3D * scaleFactor,“颜色”、颜色);loc = loc * scaleFactor;以厘米为单位可视化点云cameraSize = 2;图plotCamera (“大小”cameraSize,“颜色”“r”“标签”' 1 '“不透明度”, 0);持有网格plotCamera (“位置”疯狂的,“定位”东方,“大小”cameraSize,...“颜色”“b”“标签”' 2 '“不透明度”, 0);可视化点云pcshow (ptCloud“VerticalAxis”“y”“VerticalAxisDir”“下来”...“MarkerSize”, 45岁);camorbit (0, -30);camzoom (1.5);标记坐标轴包含(“轴(cm)”);ylabel (“轴(cm)”);zlabel (“z轴(cm)”)标题(“场景的度量重建”);

图中包含一个轴对象。标题为Metric Reconstruction of The Scene的坐标轴对象包含行、文本、补丁、散点类型的21个对象。

总结

这个例子展示了如何恢复相机运动和重建场景的3-D结构从两个图像拍摄与校准相机。

参考文献

[1]哈特利,理查德和安德鲁·泽瑟曼。计算机视觉中的多视图几何。第二版。剑桥,2000年。