使用OpenCV(Python)拼接多个图像

kru*_*son 15 opencv computer-vision image-stitching

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

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

但是我没有在最后显示特征点之间的界限,而是使用这个/sf/answers/1424888181/函数从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

任何人都可以告诉我,如果我使用正确的方法,或者有人发现错误或看到我做错了什么.

mem*_*ecs 13

一步一步,假设你要缝合四个图像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部分使用不变特征自动全景图像拼接.

  • @memecs论文的链接已经死了. (3认同)

Luk*_*uke 5

黑客方法

考虑到您编写的函数,最简单的方法(虽然不是非常有效)是通过将全景图像与每个连续图像拼接来增大全景图像。像这样的伪代码:

panorama = images[0]
for i in 1:len(images)-1
    panorama = stitch(panorama,images[i])
Run Code Online (Sandbox Code Playgroud)

此方法基本上尝试将下一张图像与当前全景图的任何部分进行匹配。假设每个新图像都在当前全景图的边界上,并且没有太多透视失真,它应该可以很好地工作。

数学方法

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

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

有关为什么要乘以变换的背景,请参阅:变换和矩阵乘法,特别是“变换的组合”部分。