通过单应矩阵获取图像特征之间的运动

信息处理 计算机视觉 opencv 相机校准 单应性 相机姿势
2022-02-16 16:26:53

我一直在阅读关于如何获得相机姿势(旋转、平移等)的几个非常好的答案,例如this onethis one,但我不确定这如何适用于我的问题。

  • 我的问题:我有两个平面场景的图像(上面的地形图像),我想找到相机在两个图像之间经历的运动(dX,d是的).
  • 我做了什么:我有一个地形的 image1 和 image2,它们的特征匹配,并通过 OpenCV 的 C++ 函数获得了它的单应性:

    cv::Mat H = cv::findHomography(image1points, image2points, CV_RANSAC);

    看起来确实是仿射变换:

    (一种bCdeF001)

  • 我需要帮助:

    1. 在这个矩阵中,我不知道什么是参考系dX,d是的参数。(dX,d是的)=(C,F)
    2. 如何提取两个图像的 2D 轴之间的旋转角度和缩放因子。(现在我正在使用这个建议,但结果似乎并不可靠)。
    3. 一旦我拥有了所有四个参数:dX,d是的,旋转角度,缩放。我如何使用第一个图像的轴作为我的参考框架来实际计算相机的运动(图像之间)。
1个回答

首先,校准你的内在函数:焦距和主点。单应性并不是真正的刚性变换,而是一个平面到另一个平面的映射。您真正需要的是 6DOF 参数化,即相机姿势。如果你有内在函数,你可以将你的坐标转移到归一化坐标并使用8 点算法估计基本矩阵- 或者更好的一个是五点算法(检查thisthisthis)。该操作与在未校准设置中求解基本矩阵相同。但是,仅仅因为你有你的ķ,您可以恢复基本矩阵。请注意,这种估计不假设平面场景,实际上可以对 3D 结构进行操作。

然后,您可以将基本矩阵分解为

=R[]X
在哪里[]X是斜对称形式。要获取组件,请按照此处的说明进行操作。请注意,此问题有 4 种可能的解决方案,通常通过检查所有解决方案来确定最佳解决方案。

如果您的相机未校准,您可以使用场景中的一些已知尺寸或网格来近似校准。

如果您使用的是模拟图像,那么您就知道 FOV 和图像尺寸。如果是这种情况,您可以获得相机矩阵。或者更好,如果你有你的ķ矩阵(您可以人为地组成一个),然后您可以计算 OpenGL 等价物。检查这里这里


为您一一解答:

  1. 它们位于像素坐标中,表示主点(图像的计算中心)。
  2. 很遗憾,被定义到一个比例,你只能恢复比例,如果你有一个已知的对象在场景中的大小。你只需要知道一个距离就可以做到这一点。它可能是一个标记,一些现有家具的长度,或者你检查的对象等等。
  3. 使用我已经提供的解释(上面)。

此外,它不是仿射变换,而是投影映射(透视变换)。事实上,单应性只不过是一个平面到另一个平面的转换。