主要内容

运动中的结构,两种观点

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

概述

这个例子展示了如何从一对2-D图像重建一个3-D场景使用校准的相机相机校准器.算法由以下步骤组成:

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

  2. 估计基本矩阵使用estimateFundamentalMatrix

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

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

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

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

  7. 恢复实际规模,导致公制重建。

读一组图片

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

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

负载相机参数

这个例子使用的相机参数计算相机校准器应用。参数存储在cameraParams对象,并包含相机固有特性和镜头失真系数。

加载预先计算的摄像机参数负载upToScaleReconstructionCameraParameters.mat

消除镜头畸变

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

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

找到图像之间的点对应

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

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

%创建点跟踪器追踪=愿景。PointTracker (“MaxBidirectionalError”, 1“NumPyramidLevels”5);初始化点跟踪器imagePoints1 = imagePoints1.Location;初始化(跟踪、imagePoints1 I1);%追踪积分[imagePoints2, valididdx] =步骤(跟踪器,I2);matchedPoints1 = imagePoints1(valididdx,:);matchedpointts2 = imagepointts2 (valididdx,:);%可视化通讯图showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2);标题(“跟踪特性”);

估计基本矩阵

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

估算基本矩阵[fMatrix, epipolarInliers] = estimate基矩阵(...matchedPoints1 matchedPoints2,“方法”“MSAC”“NumTrials”, 10000);找到对极嵌线inlierPoints1 = matchedPoints1(epipolarInliers,:);inlierPoints2 = matchedPoints2(epipolarInliers,:);%显示嵌套匹配图showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2);标题(“纵向窗”);

计算相机姿态

计算两个图像对应的相机姿态之间的旋转和平移。请注意,t是单位向量,因为平移只能按比例计算。

[R, t] = cameraPose(fMatrix, cameraParams, inlierPoints1, inlierPoints2);

重建匹配点的三维位置

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

%检测密集的特征点imagePoints1 = detectMinEigenFeatures (im2gray (I1),“MinQuality”, 0.001);%创建点跟踪器追踪=愿景。PointTracker (“MaxBidirectionalError”, 1“NumPyramidLevels”5);初始化点跟踪器imagePoints1 = imagePoints1.Location;初始化(跟踪、imagePoints1 I1);%追踪积分[imagePoints2, valididdx] =步骤(跟踪器,I2);matchedPoints1 = imagePoints1(valididdx,:);matchedpointts2 = imagepointts2 (valididdx,:);%计算相机的每个位置的相机矩阵%第一个相机在原点沿x轴观察。因此,其%旋转矩阵为单位矩阵,其平移向量为0。camMatrix1 = cameraMatrix(cameraParams, eye(3), [0 0 0]);camMatrix2 = cameraMatrix(cameraParams, R', -t*R');%计算三维点point3d = triangulate(matchedPoints1, matchedPoints2, camMatrix1, camMatrix2);得到每个重建点的颜色numPixels = size(I1, 1) * size(I1, 2);allColors =重塑(I1, [numPixels, 3]);colorred = sub2ind([size(I1, 1), size(I1, 2)], round(matchedPoints1(:,2)), colorred;...轮(matchedPoints1 (: 1)));color = allcolor (colorIdx,:);%创建点云ptCloud = pointCloud (points3D,“颜色”、颜色);

显示三维点云

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

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

将一个球体放入点云以找到球体

在点云中通过将球体拟合到三维点上找到球体pcfitsphere函数。

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

场景的度量重建

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

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

总结

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

参考文献

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