使用OpenCV(Python)拼接多个图像
computer-vision
opencv
8
0

嗨,您看过很多教程,如何使用两张照片进行简单的图像拼接,这没问题。
但是,当我想用4到6张或更多的图像制作全景照片时该怎么办?

我有接受图像文件列表的代码(图像按顺序从第一个图像到最后一个图像)。然后对于每个图像,我计算SIFT特征描述符。但是后来我陷入了困境,对于两张图像,我将使用FLANN kd-tree设置匹配器,并在图像之间找到匹配项,然后计算同构图。类似于本教程http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html#py-feature-homography

但是,我没有使用此https://stackoverflow.com/a/20355545/622194函数在最后显示特征点之间的线,而是用2张图像制作了全景图。但是我不确定要将第三张和第四张图像添加到全景时该怎么做。

编辑:

根据答案,我尝试实现图像拼接脚本,以计算图像序列中彼此相邻的图像之间的单应矩阵。因此,如果我有I1,I2,I3和I4,则现在有H_12,H_23和H_34。然后,我开始使用H_12缝合I1和I2。然后,我想找到累积单应性以将I3缝合到当前全景图。我指定H_13 = H_12 * H_23并将图像3缝合到当前全景图,但是在这里我的全景图像中出现了非常明显的缝隙,当缝制下一个图像时,缝隙甚至更大,并且图像被拉伸了。这是我的代码http://pastebin.com/dQjhE5VD

谁能告诉我是否为此使用了正确的方法,或者有人可以发现错误或查看我在做什么错。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

假设您要拼接四个图像I0,I1,I2,I3,您的目标是计算单应性H_0,H_1,H_2,H_3;

  1. 计算所有成对的单应性H_01,H_02,H_03,H_12,H_13,H_23,其中单应性H_01将图像I0扭曲为I1等。
  2. 选择一个锚图像,例如I1,其位置将保持固定,即H_1 = Identity
  3. 根据最大匹配数(例如I3)查找与I1更好地对齐的图像
  4. 更新H_3 = H_1 * inv(H_13)= inv(H_13)= H_31
  5. 查找更匹配I1或I3的图像,例如I2匹配I3
  6. 更新H_2 = H_3 * H_23
  7. 与上述图像I0相同
  8. 进行捆绑调整以全局优化对齐

有关详细说明,请参见本开篇论文的第4节“ 使用不变特征自动全景图像拼接”

收藏
评论

哈克方法

给定您已编写的功能,最简单的方法(虽然不是超级高效)是通过将全景图像与每个连续图像拼接在一起来扩大全景图像。像这样的伪代码:

panorama = images[0]
for i in 1:len(images)-1
    panorama = stitch(panorama,images[i])

此方法基本上是尝试将下一张图像与当前全景图的任何部分进行匹配。假设每个新图像都在当前全景图的边框上某处,并且透视图没有太多扭曲,它应该可以正常工作。

数学方法

如果您知道要拼接的顺序,另一种选择是从一个图像找到另一幅图像的单应性,然后将它们相乘。结果是从该图像到图像0的Homography。

例如:将图像3转换为与图像0对齐的H为H_03 = H_01 * H_12 * H_23。其中H_01是将图像1转换为与图像0对齐的H。(取决于其代码定义H的方式,您可能需要颠倒上述乘法顺序。)因此,您将进行乘法运算以获得H_0i,然后使用它进行转换图片i与图片0对齐。

有关为什么乘法转换的背景,请参见: 转换和矩阵乘法,特别是“转换的组成”部分。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号