从两个2D图像重建3D场景

时间:2015-08-10 23:15:26

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

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

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

  I1 = imread('DSC01063.jpg');

  I2 = imread('DSC01064.jpg');

第2步在matlab中使用相机校准器应用获取相机参数

  load cameraParams.mat 

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

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

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

第4步使用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毫米,并且从相机上看,我知道内在矩阵(或相机校准矩阵K),其形式为K = [alphax 0 x0; 0 alphay y0; 0 0 1]。

我需要计算基本矩阵F,基本矩阵E才能计算相机矩阵P1和P2,对吧

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

在Matlab中,你有triangulate函数,可以帮你完成工作。

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

答案 1 :(得分:0)

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

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

编辑: MATLAB中现在有一个cameraPose函数,它根据基本矩阵计算出一个按比例的相对姿势('R'和't')相机参数。