【问题标题】:OpenCV stitch images by warping bothOpenCV 通过扭曲两者来拼接图像
【发布时间】:2015-10-03 06:23:24
【问题描述】:

我已经找到了很多关于使用 OpenCV 进行图像拼接和变形的问题和答案,但我仍然找不到我的问题的答案。

我有两个鱼眼相机,我已成功校准,因此两张图像中的失真均已消除。

现在我想将这些校正后的图像拼接在一起。所以我几乎遵循这个例子,在很多其他拼接问题中也提到了这个例子: Image Stitching Example

所以我做了关键点和描述符检测。我找到匹配项并获得 Homography 矩阵,因此我可以扭曲其中一个图像,从而得到一个真正拉伸的图像。另一个图像保持不变。拉伸是我想避免的。所以我在这里找到了一个不错的解决方案: Stretch solution.

在幻灯片 7 上,您可以看到两个图像都发生了变形。我认为这将减少一张图像的拉伸(在我看来,拉伸将分开,例如 50:50)。如果我错了,请告诉我。

我的问题是我不知道如何扭曲两个图像以使其适合。我必须计算两个同位词吗?我是否必须定义像 Rect() 之类的参考平面?如何实现如幻灯片 7 所示的变形结果?

为了明确,我不是在德累斯顿工业大学学习,所以这只是我在研究时发现的。

【问题讨论】:

    标签: c++ opencv camera-calibration image-stitching opencv-stitching


    【解决方案1】:

    在另一张的坐标系中扭曲两幅图像中的一张更为常见,因为它更容易:可以直接从图像对应关系中计算二维扭曲变换。

    将两个图像扭曲到一个新的坐标系是可能的,但更复杂,因为它涉及 3D 转换,并且需要相对于最初的两个准确地定义一个新的 3D 坐标系。

    基本思想(非常粗略地)体现在链接演示文稿中幻灯片 #2 上的手绘图中。我做了一个更大的:

    基本上,程序如下:

    1. 如果您的相机经过校准,您可以通过计算基本矩阵、推导基本矩阵 [HZ03 第 9.6 段和方程 9.12] 并推导出相对位姿 [HZ03第 9.6.2 段]。因此,您可以估计例如将 img1 的坐标系映射到 img2 的坐标系的 3D 刚性变换 T2:

    T2 = R2 * [ I3 | 0]

    1. 据此,您可以非常准确地定义新图像相对于其他两个图像的图像平面。例如:

    Tn = square_root(R2) * [ I3 | 0]

    Tn = Tn * T2-1

    1. 从这两个相对位姿中,您可以导出像素 2D 变换,以在新图像平面中扭曲两个图像 [HZ03,示例 13.2]。基本上,从 img1 到新图像和从 img2 到新图像的翘曲单应性分别是:

    Hn = K * Rn * K-1

    Hn = K * Rn * K-1

    1. 然后您还可以计算新图像平面中有效像素的范围(即 xmin、xmax、ymin、ymax),以对其进行裁剪并形成新图像。

    请注意,第 3 步假定图像是从空间中的同一点拍摄的(纯相机旋转),否则图像之间可能会存在一些视差,从而产生可见的拼接缺陷。

    希望这会有所帮助。

    参考:[HZ03] Hartley、Richard 和 Andrew Zisserman。计算机视觉中的多视图几何。剑桥大学出版社,2003 年。

    【讨论】:

      猜你喜欢
      • 2015-03-18
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      相关资源
      最近更新 更多