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

Dam*_*dEi 12 c++ opencv camera-calibration image-stitching opencv-stitching

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

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

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

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

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

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

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

BCo*_*nic 6

在另一幅图像的坐标系中对两幅图像中的一幅进行变形更为常见,因为它更容易:可以直接从图像对应关系中计算出 2D 变形变换。

将两个图像扭曲到一个新的坐标系中是可能的,但更复杂,因为它涉及 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] Hartley、Richard 和 Andrew Zisserman。计算机视觉中的多视图几何。剑桥大学出版社,2003 年。