主要内容

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

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

概述

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

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

  2. 估计基本矩阵使用estimateEssentialMatrix

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

  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“蒙太奇”);标题(原始图像的);

图包含一个坐标轴对象。标题为原始图像的坐标轴对象包含一个类型的对象的形象。

负载相机参数

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

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

消除镜头畸变

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

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

图包含一个坐标轴对象。坐标轴对象与标题不失真图像包含一个类型的对象的形象。

找点图像之间的对应关系

检测良好的跟踪特性。减少“MinQuality”检测少点,会更均匀分布在整个图像。如果相机的运动不是很大,然后使用KLT跟踪算法是一个很好的方式来建立通讯。

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

图包含一个坐标轴对象。坐标轴对象标题150最强角落从第一映像都包含2图像类型的对象,线。

%创建点追踪追踪= 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);标题(“跟踪特性”);

图包含一个坐标轴对象。坐标轴对象标题跟踪特性包含4图像类型的对象,线。

估计基本矩阵

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

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

图包含一个坐标轴对象。坐标轴对象与标题纵向内围层包含4图像类型的对象,线。

计算出相机的姿势

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

(东方,loc) = relativeCameraPose (E, cameraParams inlierPoints1 inlierPoints2);

重建的三维位置匹配点

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

%检测密集的特征点。使用一个ROI排除点接近%的图像边缘。投资回报率=[30、30、大小(I1, 2) - 30,大小(I1, 1) - 30);imagePoints1 = detectMinEigenFeatures (im2gray (I1),“投资回报”投资回报率,“MinQuality”,0.001);%创建点追踪追踪= vision.PointTracker (“MaxBidirectionalError”,1“NumPyramidLevels”5);%初始化跟踪点imagePoints1 = imagePoints1.Location;初始化(跟踪、imagePoints1 I1);%跟踪点[imagePoints2, validIdx] =步骤(追踪,I2);matchedPoints1 = imagePoints1 (validIdx:);matchedPoints2 = imagePoints2 (validIdx:);%计算摄像机矩阵为每个摄像机的位置%的第一个镜头是在原点沿z轴。因此,其%转换身份。tform1 = rigid3d;camMatrix1 = cameraMatrix (cameraParams tform1);%计算外在第二相机东方cameraPose = rigid3d (loc);tform2 = cameraPoseToExtrinsics (cameraPose);camMatrix2 = cameraMatrix (cameraParams tform2);%计算三维点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 (“位置”疯狂的,“定位”东方,“大小”cameraSize,“颜色”,“b”,“标签”,' 2 ',“不透明度”,0);%可视化点云pcshow (ptCloud“VerticalAxis”,“y”,“VerticalAxisDir”,“下来”,“MarkerSize”,45岁);%旋转和缩放的阴谋camorbit (0, -30);camzoom (1.5);%标签轴包含(“轴”);ylabel (“轴”);zlabel (z轴的)标题(“规模重建的场景”);

图包含一个坐标轴对象。坐标轴对象与标题的规模重建场景包含21线类型的对象,文本,补丁,散射。

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

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

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

图包含一个坐标轴对象。坐标轴对象与标题估计全球的位置和尺寸包含22行类型的对象,文本,补丁,散射、表面。

场景的度量重建

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

%确定比例因子scaleFactor = 10 / globe.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)”)标题(“现场度量重建”);

图包含一个坐标轴对象。坐标轴对象标题度量重建的场景包含21线类型的对象,文本,补丁,散射。

总结

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

引用

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