我正在尝试实现 Hartley & Zisserman 的“多视图几何”(第 12.2 节)中的(相对简单的)线性齐次 (DLT) 3D 三角测量方法,目的是在未来实现其完整的“最优算法”。现在,基于这个问题,我正试图让它在 Matlab 中工作,然后将其移植到 C++ 和 OpenCV 中,并在此过程中测试一致性。
问题是我不确定如何使用我拥有的数据。我已经校准了我的立体装置,并获得了两个固有相机矩阵、两个失真系数向量、两个相机相关的旋转矩阵和平移向量,以及基本矩阵和基本矩阵。我还有两个点的 2D 坐标,它们应该是两个图像坐标系中单个 3D 点的对应关系(分别由第一个和第二个相机拍摄)。
该算法将两个点坐标和两个 4x3“相机矩阵”P 和 P' 作为输入。这些显然不是从校准中获得的内在相机矩阵 (M, M'),因为它们是 3x3,而且因为单独使用它们的投影将 3D 点放在两个不同的坐标系中,即 - 外在 (旋转/平移)数据丢失。
H&Z 书包含有关使用 SVD 分解从基本矩阵或基本矩阵中恢复所需矩阵的信息(第 9 章),但也有其自身的其他问题(例如尺度模糊)。我觉得我不需要那个,因为我明确定义了旋转和平移。
那么问题是:使用第一个内在矩阵是否正确,将额外的零列作为第一个“相机矩阵”(P = [M | 0]),然后将第二个内在矩阵乘以一个外在矩阵由旋转矩阵和平移向量组成作为额外的列,以获得第二个所需的“相机矩阵”(P'=M'*[R|t])?还是应该以不同的方式完成?
谢谢!