来自运动重投影问题的 OpenCV 结构

OpenCV Structure from Motion Reprojection Issue

我目前在使用基于 OpenCv 的 Structure from Motion 程序时遇到问题。 我将尝试向您描述它的作用以及它应该做什么。

此程序基于经典 "structure from motion" 方法。

基本思想是拍摄一对图像,检测它们的关键点并计算这些关键点的描述符。然后,进行关键点匹配,并进行一定数量的测试以确保结果良好。那部分工作完美。

完成后,将执行以下计算:基本矩阵、基本矩阵、基本矩阵的 SVD 分解、相机矩阵计算,最后是三角测量。

一对图像的结果是一组 3D 坐标,为我们提供了要在 3D 查看器中绘制的点。对于一对来说,这非常有效。

的确,这是我的问题:对于一对图像,3D点坐标是在图像对的第一张图像的坐标系中计算的,作为参考图像。当处理两个以上的图像时,也就是我程序的objective,我必须重新投影在第一个图像的坐标系中计算的 3D 点,以便以获得一致的结果。

我的问题是:如何将相机相关系统中给定的 3D 点坐标重新投影到其他相机相关系统中? 使用相机矩阵?

我的想法是获取 3D 点坐标,并将它们乘以之前每个相机矩阵的逆矩阵。

我澄清一下:

假设我正在处理第三张和第四张图片(因此是第三对图片,因为我正在处理 1-2 / 2-3 / 3-4 等等)。

我在第三张图片的坐标系中得到了我的 3D 点坐标,我该如何在第一张图片的坐标系中正确地重新投影它们?

我会做以下事情:

获取 3D 点坐标矩阵,应用图像 2 到 3 的相机矩阵的逆矩阵,然后应用图像 1 到 2 的相机矩阵的逆矩阵。 这是否正确?

因为那些相机矩阵都是非方阵,我不能求逆

我肯定在某个地方弄错了,如果有人能启发我,我将不胜感激,我很确定这是一个相对简单的问题,但我显然遗漏了一些东西......

非常感谢阅读:)

假设您有一个名为 P 的 3 * 4 外部参数矩阵。为了匹配 OpenCV documentation 的符号,这是 [R|t]

这个矩阵P描述了从世界space坐标到相机space坐标的投影。引用文档:

[R|t] translates coordinates of a point (X, Y, Z) to a coordinate system, fixed with respect to the camera.

您想知道为什么这个矩阵不是正方形的。那是因为在 OpenCV 的通常上下文中,您不期望 homogeneous coordinates 作为输出。因此,要使其成为正方形,只需添加包含 (0,0,0,1) 的第四行。我们称这个新方阵为Q

每对相机都有一个这样的矩阵,也就是说,每对图像 {k,k+1} 都有一个 Qk 矩阵,它描述了坐标 space 的投影相机 k 到相机 k+1。这些矩阵是可逆的,因为它们描述了齐次坐标中的等距。

要从相机 3 的坐标 space 到相机 1 的坐标,只需将 Q2 的倒数应用于您的点,然后 Q1.

的倒数