这是我第一次进行图像处理。所以我有很多问题: 我有两张照片是从不同的位置拍摄的,一张来自左边,另一张来自右边,如下图所示。[![在此输入图像说明] [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点云。 这是正确的方法吗?
如果您对我有任何建议,我感激不尽?
谢谢!
答案 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')相机参数。