从运动结构从两种观点

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

概观

此示例演示如何从使用校准的摄像机拍摄的一对二维图像重建三维场景相机校准应用。该算法包括以下步骤:

  1. 匹配两个图像之间的稀疏点集。寻找两幅图像之间的点对应有多种方法。此示例使用detectMinEigenFeatures函数,并将它们跟踪到使用的第二个图像中vision.PointTracker。或者您可以使用extractFeatures紧随其后的是matchFeatures

  2. 估计基本矩阵使用estimateFundamentalMatrix

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

  4. 匹配两个图像之间的密集点集。重新检测点使用detectMinEigenFeatures以减少“MinQuality”获得更多的积分。然后使用跟踪密点到第二图像vision.PointTracker

  5. 使用以下命令确定匹配点的三维位置由三角形组成的

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

  7. 恢复实际的规模,导致度量重建。

读取图像中的一对

加载一对图像到工作区。

imageDir = fullfile (toolboxdir ('视力'),'visiondata''upToScaleReconstructionImages');图像= imageDatastore (imageDir);I1 = readimage(图像,1);I2 = readimage(图像,2);图imshowpair (I1、I2'剪辑');标题(“原始图像”);

负载相机参数

此示例使用由cameraCalibrator参数存储在cameraParams对象,并包括摄像机内部物理和镜头畸变系数。

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

卸下镜头扭曲

镜头畸变会影响最终重建的精度。可以使用。移除每个图像的失真undistortImage函数。这一过程拉直的线是弯曲的径向畸变的镜头。

I1 =不失真timage (I1, cameraParams);I2 =不失真timage (I2, cameraParams);图imshowpair (I1、I2'剪辑');标题(“图像不变形”);

查找图像之间的对应点

检测要跟踪的好特性。减少“MinQuality”检测较少的点,这将在整个图像被更均匀地分布。如果摄像机的运动不是非常大,然后利用KLT算法跟踪是一个很好的方式来建立对应点。

%检测特征点imagePoints1 = detectMinEigenFeatures (rgb2gray (I1),“MinQuality”,0.1);%可视化检测点图imshow(I1,'InitialMagnification',50);标题(“150度最强角从所述第一图像”);保持情节(selectStrongest (imagePoints1, 150));

创建点跟踪器跟踪= vision.PointTracker(“MaxBidirectionalError”1,“NumPyramidLevels”,5);初始化点跟踪器imagePoints1 = imagePoints1.Location;初始化(跟踪器,imagePoints1,I1);%轨迹的点[imagePoints2,validIdx] =步骤(跟踪器,I2);matchedPoints1 = imagePoints1(validIdx,:);matchedPoints2 = imagePoints2(validIdx,:);%对应可视化figure showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2);标题(“跟踪功能”);

估计基本矩阵

使用estimateFundamentalMatrix函数的作用是:计算基本矩阵并找到满足极外约束的点。

估计基本矩阵[fMatrix,epipolarInliers] = estimateFundamentalMatrix(...matchedPoints1,matchedPoints2,'方法'“MSAC”“NumTrials”,10000);%查找极正常值inlierPoints1 = matchedPoints1(偏极化inliers,:);inlierPoints2 = matchedPoints2(偏极化inliers,:);%显示输入匹配图showMatchedFeatures(I1,I2,inlierPoints1,inlierPoints2);标题(“对极正常值”);

计算相机姿态

计算与两幅图像对应的相机姿态之间的旋转和平移。请注意,Ť是一个单位矢量,因为翻译只能被计算到刻度。

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

重建匹配点的3-d的地点

重新检测点在第一个图像使用较低“MinQuality”获得更多的积分。跟踪新的点到第二图像。估计对应于使用的匹配点的3-d的位置由三角形组成的功能,它实现了直接线性变换(DLT)算法[1]。放置在原点对应于第一图像的摄像机的光学中心。

%检测密集特征点imagePoints1 = detectMinEigenFeatures (rgb2gray (I1),“MinQuality”,0.001);创建点跟踪器跟踪= vision.PointTracker(“MaxBidirectionalError”1,“NumPyramidLevels”,5);初始化点跟踪器imagePoints1 = imagePoints1.Location;初始化(跟踪器,imagePoints1,I1);%轨迹的点[imagePoints2,validIdx] =步骤(跟踪器,I2);matchedPoints1 = imagePoints1(validIdx,:);matchedPoints2 = imagePoints2(validIdx,:);计算相机每个位置的相机矩阵第一个相机在原点,沿x轴观察。因此,其%旋转矩阵为单位矩阵,其平移向量为0。camMatrix1 = cameraMatrix(cameraParams,眼(3),[0 0 0]);camMatrix2 = cameraMatrix(cameraParams,R '-t * R');%计算3-d分points3D =三角测量(matchedPoints1,matchedPoints2,camMatrix1,camMatrix2);%获取每个重建点的颜色numPixels =大小(I1,1)*大小(I1,2);allColors =重塑(I1,[numPixels,3]);colorIdx = sub2ind([大小(I1,1),大小(I1,2)],圆(matchedPoints1(:,2)),...轮(matchedPoints1(:,1)));颜色= allColors(colorIdx,:);创建点云ptCloud =点云(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);%标签的轴包含(“x轴”);ylabel(“y轴”);zlabel(“z轴”)标题(“截至场景的标度重建”);

装上球的点云找到地球

发现在点云地球由球体拟合使用的3 d点pcfitsphere函数。

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

场景的度量重建

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

%确定比例因子比例因子= 10 / globe.Radius;缩放点云ptCloud =点云(points3D *比例因子,“颜色”、颜色);t = t *比例因子;%在可视化厘米的点云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轴(厘米)”)标题(“现场度量重建”);

摘要

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

参考文献

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