【问题标题】:Reconstruct 3D scene from two 2D images从两个 2D 图像重建 3D 场景
【发布时间】:2015-11-03 00:34:15
【问题描述】:

这是我第一次做图像处理。所以我有很多问题: 我有两张从不同位置拍摄的照片,一张从左侧拍摄,另一张从右侧拍摄,如下图所示。[![在此处输入图像描述][1]][1]

第一步使用imread函数读取图片

  I1 = imread('DSC01063.jpg');

  I2 = imread('DSC01064.jpg');

第二步在matlab中使用camera calibrator app获取cameraParameters

  load cameraParams.mat 

第 3 步使用 undistortImage 函数去除镜头失真

  [I1, newOrigin1] = undistortImage(I1, cameraParams, 'OutputView', 'same');

  [I2, newOrigin2] = undistortImage(I2, cameraParams, 'OutputView', 'same');

第四步使用detectSURFFeatures函数检测特征点

  imagePoints1 = detectSURFFeatures(rgb2gray(I1), 'MetricThreshold', 600);

  imagePoints2 = detectSURFFeatures(rgb2gray(I2), 'MetricThreshold', 600);

第 5 步使用 extractFeatures 函数提取特征描述符

  features1 = extractFeatures(rgb2gray(I1), imagePoints1);

  features2 = extractFeatures(rgb2gray(I2), imagePoints2);

第 6 步使用 matchFeatures 函数匹配特征

  indexPairs = matchFeatures(features1, features2, 'MaxRatio', 1);

  matchedPoints1 = imagePoints1(indexPairs(:, 1));

  matchedPoints2 = imagePoints2(indexPairs(:, 2));

从那里,我如何构建 3D 点云??? 在第 2 步中,我使用图片附件中的棋盘格来校准相机[![在此处输入图像描述][ 2]][2]

正方形大小为 23 毫米,从 cameraParams.mat 我知道内部矩阵(或相机校准矩阵 K),其形式为 K=[alphax 0 x0; 0阿尔法y0; 0 0 1]。

为了计算相机矩阵 P1 和 P2,我需要计算基本矩阵 F、基本矩阵 E,对吧???

之后,当我拥有相机矩阵 P1 和 P2 时,我使用线性三角测量方法来估计 3D 点云。 方法对吗?

如果您对我有任何建议,我将不胜感激?

谢谢!

【问题讨论】:

  • 对不起!我无法发布图片。
  • 如果将undistortImageOutputView参数设置为same,那么newOrigin就不用管了,因为它是[0 0]。
  • @TRITRAN,您的代码是否可以使用 2 张图片?如果可以,请给我完整的代码,我的项目需要它,它是完成它所需的最后一部分,谢谢

标签: matlab computer-vision matlab-cvst 3d-reconstruction


【解决方案1】:

要对点进行三角测量,您需要所谓的“相机矩阵”以及每张图像中的 2D 点(您已经拥有)。

在 Matlab 中,您有函数 triangulate,它可以为您完成这项工作。

如果您已经校准了相机,那么您应该已经拥有这些信息。无论如何,you have here an example 如何创建三角测量所需的“stereoParams”对象。

【讨论】:

  • @TRITRAN 如果有帮助,请考虑接受它作为回答
  • 我仍然很困惑,如果我使用像这样的函数 triangulate [worldPoints,reprojectionErrors] = triangulate(matchedPoints1,matchedPoints2,cameraMatrix1,cameraMatrix2) 我需要 cameraMatrix1,cameraMatrix2,但我没有这些相机矩阵.由于我的项目的原因,我不能在两个 2D 图像中使用棋盘。
  • @TRITRAN 如果您没有这些值,我不知道您是否可以获得世界坐标......您需要知道相机的位置以及它们之间的关系才能获得3D坐标。或许您可以在研究论文中找到一些最先进的算法来满足您的需求,但您可能可以通过“标准”方式找到。
  • 我有步骤 2 中的 cameraParams.mat 和所有图片,但我不能在这里发布它们。我使用 16 张棋盘格图片来校准相机,在文件 cameraParams.mat 中我有一些参数,如 RotationMatrices(3x3x16 双)、TranslationVectors(16x3 双)、IntrinsicMatrix(3x3 双)等等......
【解决方案2】:

是的,这是正确的方法。现在您已经匹配了点,您可以使用estimateFundamentalMatrix 来计算基本矩阵 F。然后通过将 F 乘以外部矩阵来获得基本矩阵 E。请注意乘法的顺序,因为cameraParameters 中的内在矩阵相对于您在大多数教科书中看到的内容进行了转置。

现在,您必须decompose E into a rotation and a translation,您可以从中使用cameraMatrix 构造第二个摄像头的摄像头矩阵。您还需要第一个相机的相机矩阵,其旋转将是一个 3x3 单位矩阵,而平移将是一个 3 元素 0 向量。

编辑:现在在 MATLAB 中有一个 cameraPose 函数,它在给定基本矩阵和相机参数的情况下计算一个按比例缩放的相对姿势(“R”和“t”) .

【讨论】:

  • 嗨迪玛!太感谢了。下一步,我计算基本矩阵 F。从相机校准矩阵 K(其形式为 K=[alphax 0 x0; 0 alphay y0; 0 0 1]),我找到基本矩阵 E = K' * F * K
  • 我假设相机矩阵 P1 = K * eye(3,4)。然后分解 E: [U,S,V] = svd(E) 得到相机矩阵 P2 的 4 个解
  • P2(:,:,1) = [U * W * V ', u3]; P2(:,:,2) = [U * W * V ', -u3]; P2(:,:,3) = [U * W ' * V ', u3]; P2(:,:,4) = [U * W ' * V ', -u3];
  • 在那之后,我找到了更正的一个P2final。通过使用线性三角测量方法,我可以估计 3D 点云。我是否需要计算重投影误差以消除噪声点???这是正确的方法吗?
猜你喜欢
  • 2015-04-26
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多