我目前面临基于 OpenCv 的 Structure from Motion 程序的问题。 我将尝试向您描述它的作用以及它应该做什么。
该程序基于经典的“运动结构”方法。
基本思想是拍摄一对图像,检测它们的关键点并计算这些关键点的描述符。然后进行关键点匹配,并进行一定次数的测试以确保结果良好。这部分工作完美。
完成后,将执行以下计算:基本矩阵、本质矩阵、本质矩阵的 SVD 分解、相机矩阵计算,最后是三角测量。
一对图像的结果是一组 3D 坐标,为我们提供了要在 3D 查看器中绘制的点。对于一对来说,这非常有效。
确实,这是我的问题:对于一对图像,3D点坐标是在图像对的第一张图像的坐标系中计算的,作为参考图像。当处理两个以上图像时(这是我的程序的目标),我必须重新投影在第一个图像的坐标系中计算的 3D 点,以获得一致的结果。
我的问题是:如何将相机相关系统中给出的 3D 点坐标重新投影到其他相机相关系统中?使用相机矩阵?
我的想法是获取 3D 点坐标,并将它们乘以之前每个相机矩阵的逆矩阵。
我澄清一下:
假设我正在处理第三个和第四个图像(因此是第三对图像,因为我正在处理 1-2 / 2-3 / 3-4 等)。
我在第三个图像的坐标系中获得了 3D 点坐标,如何在第一个图像坐标系中正确地重新投影它们?
我会做以下事情:
获取 3D 点坐标矩阵,对图像 2 至 3 应用相机矩阵的逆,然后对图像 1 至 2 应用相机矩阵的逆。 这是正确的吗?
因为那些相机矩阵是非方阵,我无法对它们求逆。
我肯定在某个地方弄错了,如果有人能启发我,我将不胜感激,我很确定这是一个相对简单的问题,但我显然错过了一些东西......
非常感谢您的阅读:)
假设您有一个 3 * 4 外部参数矩阵,称为
P
。为了匹配 OpenCV 文档的符号,这是 [R|t]
。
这个矩阵
P
描述了从世界空间坐标到相机空间坐标的投影。引用文档:
[R|t] 将点 (X, Y, Z) 的坐标转换到相对于相机固定的坐标系。
您想知道为什么这个矩阵是非方形的。这是因为在 OpenCV 的通常上下文中,您并不期望“齐次坐标”作为输出。因此,要使其成为正方形,只需添加包含 (0,0,0,1)
的第四行即可。我们称这个新方阵为
Q
。 每对相机都有一个这样的矩阵,也就是说,每对图像
Qk
都有一个
{k,k+1}
矩阵,它描述了从相机k
的坐标空间到相机k+1
的坐标空间的投影。这些矩阵是可逆的,因为它们描述齐次坐标中的等距。要从相机 3 的坐标空间转到相机 1 的坐标空间,只需将
Q2
的逆函数和
then
Q1
的逆函数应用于您的点。