主要内容

结构运动从两种不同的观点

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

概述

这个例子展示了如何重构三维场景从一副二维图像相机校准使用相机校准器应用。该算法由以下步骤组成:

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

  2. 估计基本矩阵使用estimateEssentialMatrix

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

  4. 匹配一个密集的两幅图像之间的点集。Re-detect点使用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“蒙太奇”);标题(原始图像的);

负载相机参数

下面的例子使用了相机参数的计算相机校准器应用程序中存储的参数cameraIntrinsics对象,包括相机intrinsic和透镜畸变系数。

%加载预先计算的相机intrinsicdata =负载(“sfmCameraIntrinsics.mat”);intrinsic = data.intrinsics;

消除镜头畸变

透镜畸变会影响最终的重建的准确性。您可以删除使用的每个图像的失真undistortImage函数。这个过程让线弯曲的镜头的径向畸变。

I1 = undistortImage (I1, intrinsic);I2 = undistortImage (I2, intrinsic);图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, validIdx] =步骤(追踪,I2);matchedPoints1 = imagePoints1 (validIdx:);matchedPoints2 = imagePoints2 (validIdx:);%可视化通讯图showMatchedFeatures (I1、I2 matchedPoints1 matchedPoints2);标题(“跟踪特性”);

估计基本矩阵

使用estimateEssentialMatrix函数计算基本矩阵和发现窗点满足纵向约束。

%估计基本矩阵[E, epipolarInliers] = estimateEssentialMatrix (matchedPoints1、matchedPoints2 intrinsic,信心= 99.99);%发现纵向窗inlierPoints1 = matchedPoints1 (epipolarInliers:);inlierPoints2 = matchedPoints2 (epipolarInliers:);%显示窗匹配图showMatchedFeatures (I1、I2 inlierPoints1 inlierPoints2);标题(“纵向窗”);

计算出相机的姿势

计算第二个摄像机的位置和方向相对于第一个。请注意,疯狂的是一个翻译单位向量,因为翻译只能计算规模。

relPose = estrelpose (E, intrinsic inlierPoints1 inlierPoints2);

重建的三维位置匹配点

Re-detect分在第一图像使用低“MinQuality”来获得更多的点。跟踪新分进入第二图像。估计三维位置对应匹配点使用由三角形组成的函数,它实现了直接线性变换(DLT)算法[1]。原点在相机的光学中心对应的第一形象。

%检测密集的特征点。使用一个ROI排除点接近%的图像边缘。边境= 30;投资回报率=[边境,边境,大小(I1, 2) - 2 *边境,边界大小(I1, 1) - 2 *);imagePoints1 = detectMinEigenFeatures (im2gray (I1),投资回报率= ROI,MinQuality = 0.001);%创建点追踪追踪=愿景。PointTracker (MaxBidirectionalError = 1, NumPyramidLevels = 5);%初始化跟踪点imagePoints1 = imagePoints1.Location;初始化(跟踪、imagePoints1 I1);%跟踪点[imagePoints2, validIdx] =步骤(追踪,I2);matchedPoints1 = imagePoints1 (validIdx:);matchedPoints2 = imagePoints2 (validIdx:);%计算摄像机矩阵为每个摄像机的位置%的第一个镜头是在原点沿z轴。因此,其%转换身份。camMatrix1 = cameraProjection (intrinsic rigidtform3d);camMatrix2 = cameraProjection (intrinsic pose2extr (relPose));%计算三维点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 = pointCloud (points3D,“颜色”、颜色);

显示三维点云

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

%可视化摄像机的位置和方向cameraSize = 0.3;图plotCamera(大小= cameraSize颜色=“r”标签=' 1 ',透明度= 0);持有网格plotCamera (AbsolutePose = relPose、大小= cameraSize,颜色=“b”标签=' 2 ',透明度= 0);%可视化点云pcshow (ptCloud VerticalAxis =“y”VerticalAxisDir =“下来”MarkerSize = 45);%旋转和缩放的阴谋camorbit (0, -30);camzoom (1.5);%标签轴包含(“轴”);ylabel (“轴”);zlabel (z轴的)标题(“规模重建的场景”);

适合一个球体的点云找到世界各地

找到世界各地的点云拟合球面的3 d点使用pcfitsphere函数。

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

场景的度量重建

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

%确定比例因子scaleFactor = 10 / globe.Radius;%点云ptCloud = pointCloud (points3D * scaleFactor,颜色=颜色);relPose。翻译= relPose。翻译* scaleFactor;%可视化厘米的点云cameraSize = 2;图plotCamera(大小= cameraSize颜色=“r”标签=' 1 ',透明度= 0);持有网格plotCamera (AbsolutePose = relPose、大小= cameraSize,颜色=“b”标签=' 2 ',透明度= 0);%可视化点云pcshow (ptCloud VerticalAxis =“y”VerticalAxisDir =“下来”MarkerSize = 45);camorbit (0, -30);camzoom (1.5);%标签轴包含(“轴(cm)”);ylabel (“轴(cm)”);zlabel (“z轴(cm)”)标题(“现场度量重建”);

总结

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

引用

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