OpenCV通过扭曲两者来缝合图像

时间:2015-07-14 14:31:47

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

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

我有两个鱼眼摄像头,我成功校准,因此两个图像中的失真都被消除了。

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

所以我做了Keypoint和Descriptor检测。我找到了匹配并获得了Homography矩阵,因此我可以扭曲其中一个图像,这样可以得到一个非常拉伸的图像。另一张图片保持不变。拉伸是我想要避免的。所以我找到了一个很好的解决方案: Stretch solution

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

我遇到的问题是我不知道如何扭曲两张图像以使它们适合。我必须计算两个同性恋吗?我是否必须像Rect()或其他东西一样定义参考平面?如何实现如幻灯片7所示的变形结果?

为了说清楚,我不是在德累斯顿工业大学学习,所以这只是我在研究时发现的东西。

1 个答案:

答案 0 :(得分:4)

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

将两个图像变形为新的坐标系是可能的,但更复杂,因为它涉及3D变换,需要相对于最初的两个精确定义新的3D坐标系。

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

enter image description here

基本上,程序如下:

  1. 如果您的相机已经过校准,您可以通过计算基本矩阵,推导出基本矩阵[HZ03第9.6段和公式9.12],并推导出相对姿势[HZ03]来估算两幅图像之间的相对3D姿态。第9.6.2段]。因此,您可以估计例如将img1的坐标系映射到img2的坐标系上的3D刚性变换T 2< -1
  2. T 2< -1 = R 2< -1 * [I 3 | 0]

    1. 由此,您可以非常准确地定义新图像的图像平面,相对于其他两个图像。例如:
    2. T n< -1 = square_root(R 2< -1 )* [I 3 | 0]

      T n< -2 = T n< -1 * T 2< -1 -1

      1. 从这两个相对姿势中,您可以导出像素2D变换以扭曲新图像平面中的两个图像[HZ03,示例13.2]。基本上,从img1到新图像以及从img2到新图像的翘曲单应性是:
      2. H n< -1 = K * R n< -1 * K -1

        H n&lt; -2 = K * R n < - 2 * K -1

        1. 然后,您还可以计算新图像平面中的有效像素范围(即xmin,xmax,ymin,ymax),裁剪它并形成新图像。
        2. 请注意,步骤#3假设图像是从空间中的相同点拍摄的(纯相机旋转),否则图像之间可能会出现一些视差,这会产生可见的拼接瑕疵。

          希望这有帮助。

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