OpenCV通过对图像进行变形来拼接图像。

12

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

我有两个鱼眼相机,成功地对其进行了校准,因此两个图像中的畸变都被消除了。

现在我想将这些矫正的图像拼接在一起。所以我基本上按照这个例子做,这个例子也在很多其他的拼接问题中提到: 图像拼接示例

所以我做了Keypoint和Descriptor检测。我找到了匹配项,也获得了Homography矩阵,因此我可以变形其中一个图像,这给我带来了一个非常拉伸的图像作为结果。另一个图像保持不变。我想避免拉伸。所以我在这里找到了一个不错的解决方案: 拉伸解决方案

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

我遇到的问题是,我不知道如何变形两个图像使它们拟合。我需要计算两个Homografies吗?我需要定义一个参考平面,比如Rect()之类的东西吗?如何实现类似第7页所示的变形结果呢?

为了让它更清楚,我并没有在TU Dresden学习,所以这只是我在研究中发现的东西。

1个回答

6
将其中一幅图像在另一幅图像的坐标系中进行变形更为常见,因为这样更容易:可以直接从图像对应关系计算出二维变形转换。
将两幅图像都变形到一个新的坐标系中是可能的,但更为复杂,因为它涉及三维变换,并需要准确定义一个新的三维坐标系来与初始的两个坐标系相关联。
基本思想在链接演示文稿的第二张幻灯片上用手绘图表示(非常粗略)。我画了一个更大的图。

enter image description here

基本上,流程如下:
1. 如果您的相机已校准,则可以通过计算基础矩阵、推导本质矩阵[H03第9.6段和方程9.12]以及推导相对位姿[H03第9.6.2段]仅从特征对应中估计两个图像之间的相对3D姿态。因此,例如,您可以估计将img1的坐标系映射到img2的坐标系的三维刚体变换T2<-1
T2<-1 = R2<-1 * [ I3 | 0 ]
2. 从此,您可以非常精确地定义新图像相对于其他两个图像的图像平面。例如:
Tn<-1 = square_root( R2<-1) * [ I3 | 0 ]
Tn<-2 = Tn<-1 * T2<-1-1 从这两个相对姿态中,您可以推导出像素2D变换,以使两个图像在新的图像平面中扭曲 [HZ03,示例13.2]。基本上,从img1到新图像的扭曲单应性和从img2到新图像的单应性分别为:
Hn<-1 = K * Rn<-1 * K-1 Hn<-2 = K * Rn<-2 * K-1 然后,您还可以计算新图像平面中有效像素的范围(即xmin、xmax、ymin、ymax),以裁剪它并形成一个新图像。
请注意,步骤#3假定图像是从空间中的同一点拍摄的(纯相机旋转),否则可能会在图像之间产生一些视差,这可能会产生可见的拼接瑕疵。
希望对您有所帮助。
参考资料:[HZ03] Hartley,Richard和Andrew Zisserman。计算机视觉中的多视角几何。剑桥大学出版社,2003年。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接