12

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

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

现在我想将这些校正后的图像拼接在一起。所以我非常关注这个例子,在很多其他拼接问题中也提到了这个例子: 图像拼接示例

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

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

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

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

4

1 回答 1

6

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

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

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

在此处输入图像描述

基本上,程序如下:

  1. 如果您的相机经过校准,您可以通过计算基本矩阵、推导基本矩阵 [HZ03 第 9.6 段和方程 9.12] 并推导相对姿态 [HZ03 第 9.6 段],仅从特征对应关系中估计两个图像之间的相对 3D 位姿。 2]。因此,您可以估计例如 3D 刚性变换 T 2<-1将 img1 的坐标系映射到 img2 的坐标系:

T 2<-1 = R 2<-1 * [ I 3 | 0]

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

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 到新图像的翘曲单应性分别是:

H n<-1 = K * R n<-1 * K -1

H n<-2 = K * R n<-2 * K -1

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

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

希望这可以帮助。

参考:[HZ03] 哈特利、理查德和安德鲁齐瑟曼。计算机视觉中的多视图几何。剑桥大学出版社,2003 年。

于 2016-07-25T19:39:03.627 回答