从运动结构从两种观点

从运动(SFM)结构为从一组2- d的图像的估计场景的3-d结构的过程。这个例子展示了如何从两个图像估计校准的相机的姿势,重建场景向上的3-d结构一个未知的比例因子,然后通过检测已知的大小的物体恢复实际的比例因子。

概观

此示例示出了如何从一个照相机拍摄的一对2-d的图像重构3-d场景使用校准相机校准应用。该算法包括以下步骤:

  1. 匹配一个稀疏集两幅图像之间的点。有找到两个图像之间的对应点的多种方式。本实施例中使用所述检测第一图像中的拐角detectMinEigenFeatures功能,并跟踪它们变成使用第二图像vision.PointTracker。或者您可以使用extractFeatures其次是matchFeatures

  2. 使用估计基本矩阵estimateFundamentalMatrix

  3. 计算相机的使用的运动cameraPose功能。

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

  5. 使用确定匹配点的3-d的位置三角测量

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

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

读取图像中的一对

加载一对图像到工作区。

IMAGEDIR =完整文件(toolboxdir('视力''visiondata''upToScaleReconstructionImages');图像= imageDatastore(IMAGEDIR);I1 = readimage(图像,1);I2 = readimage(图像,2);图imshowpair(I1,I2,'剪辑');标题(“原始图像”);

负载摄像机参数

此示例使用所计算出的照相机参数cameraCalibrator应用程序。这些参数被存储在cameraParams对象,并且包括相机内在和透镜畸变系数。

%负载预先计算照相机参数加载upToScaleReconstructionCameraParameters.mat

卸下镜头扭曲

透镜畸变会影响最终的重建的精度。您可以从每个使用图像的消除失真undistortImage功能。这个过程拉直由透镜的径向失真弯曲的线条。

I1 = undistortImage(I1,cameraParams);I2 = undistortImage(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,:);%对应可视化图showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2);标题(“跟踪功能”);

估计基本矩阵

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

%的估计基本矩阵[fMatrix,epipolarInliers] = estimateFundamentalMatrix(...matchedPoints1,matchedPoints2,'方法''MSAC''的numtrials',10000);%查找极正常值inlierPoints1 = matchedPoints1(epipolarInliers,:);inlierPoints2 = matchedPoints2(epipolarInliers,:);%显示内点火柴图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,'颜色',颜色);

显示3-d点云

使用plotCamera功能可视化摄像头的位置和方向,以及pcshow功能以可视化的点云。

%可视化照相机的位置和方向cameraSize = 0.3;图plotCamera('尺寸',cameraSize,'颜色''R''标签''1'“透明度”,0);保持plotCamera('位置',T,'方向',R,'尺寸',cameraSize,...'颜色''B''标签''2'“透明度”,0);%可视化点云pcshow(ptCloud,“立轴”'Y''VerticalAxisDir''下'...'MarkerSize',45);%旋转和缩放的情节camorbit(0,-30);camzoom(1.5);%标签的轴xlabel(“x轴”);ylabel(“y轴”);zlabel(“z轴”)标题(“截至场景的标度重建”);

装上球的点云找到地球

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

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

现场度量重建

地球的实际半径为10cm。现在,您可以确定厘米3 d点的坐标。

%确定比例因子比例因子= 10 / globe.Radius;%刻度点云ptCloud =点云(points3D *比例因子,'颜色',颜色);T = T *比例因子;%在可视化厘米的点云cameraSize = 2;图plotCamera('尺寸',cameraSize,'颜色''R''标签''1'“透明度”,0);保持plotCamera('位置',T,'方向',R,'尺寸',cameraSize,...'颜色''B''标签''2'“透明度”,0);%可视化点云pcshow(ptCloud,“立轴”'Y''VerticalAxisDir''下'...'MarkerSize',45);camorbit(0,-30);camzoom(1.5);%标签的轴xlabel(“x轴(厘米)”);ylabel(“y轴(厘米)”);zlabel(“z轴(厘米)”)标题(“现场度量重建”);

概要

此实施例表明如何恢复相机运动和从与校准的相机拍摄的两个图像重建场景的3-d的结构。

参考

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