首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenCV (Python)缝合多个图像

使用OpenCV (Python)缝合多个图像
EN

Stack Overflow用户
提问于 2014-07-04 04:55:11
回答 3查看 29K关注 0票数 19

嗨,我看过很多教程,如何使用两张照片进行简单的图像拼接,这是没有问题的。

但是,当我想要从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

但我没有在最后显示特征点之间的线条,而是使用了这个https://stackoverflow.com/a/20355545/622194函数来从两张图像中生成全景图。但是当我想要将第三张和第四张图片添加到全景图中时,我不确定该怎么做。

编辑:

根据答案,我尝试实现我的图像拼接脚本,以计算图像序列中相邻的图像之间的单应矩阵。因此,如果我有I1 I2 I3和I4,我现在就有H_12、H_23和H_34。然后我开始使用H_12拼接I1和I2,然后我想要找到累积的单应性来拼接I3到当前的全景图。我找到H_13 = H_12*H_23并将图像3缝合到当前全景图中,但在这里我在全景图像中得到了非常明显的间隙,当下一张图像被缝合时,它的间隙更大,图像非常拉伸。

有人能告诉我我是否使用了正确的方法吗?或者有人能发现错误或看到我做错了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-04 07:13:35

一步一步,假设你想拼接四个图像I0I1I2I3,你的目标是计算单应性H_0H_1H_2H_3

  1. 计算所有成对的单应性H_01H_02H_03H_12H_13H_23,其中单应性H_01将图像I0扭曲为I1,etc...
  2. Select一个锚点图像,例如将保持固定位置的Identity
  3. Find图像,即基于最大一致匹配数更好地与I1对齐的H_1 = I1图像例如I3
  4. Update I1= H_3 = H_1 * inv(H_13) = inv(H_13) =更好地匹配I1I3I2图像例如匹配D41= H_3 * H_23

H145

请参阅这篇开创性论文Automatic Panoramic Image Stitching using Invariant Features的第4节以获得深入的解释。

票数 16
EN

Stack Overflow用户

发布于 2014-07-04 06:48:44

Hacky方法

考虑到你编写的函数,最简单的方法(虽然不是非常有效)就是通过将全景图像与每个连续的图像进行拼接来增长全景图像。类似于下面的伪代码:

代码语言:javascript
复制
panorama = images[0]
for i in 1:len(images)-1
    panorama = stitch(panorama,images[i])

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

数学方法

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

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

有关为什么要乘以变换的背景信息,请参阅:Transformations and Matrix Multiplication,特别是“变换的组合”部分。

票数 5
EN

Stack Overflow用户

发布于 2017-07-07 22:43:25

图像之间的间隙也有类似的问题。你应该做的第一件事是初始化你累积的单应性矩阵以在第一帧识别。然后,对于每一个新的帧,你应该将它乘以当前帧和下一帧之间的单应矩阵。注意使用numpy矩阵,而不是numpy数组。我不知道为什么,但它们有不同的乘法例程。

下面是我的代码:

代码语言:javascript
复制
def addFramePair(self, images, ratio=0.75, reprojThresh=4.0, showMatches=False):        
    (imageA, imageB) = images
    (kpsA, featuresA) = self.detectAndDescribe(imageA)
    (kpsB, featuresB) = self.detectAndDescribe(imageB)

    H = self.matchKeypoints(kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh)
    self.accHomography *= np.asmatrix(H)
    result = cv2.warpPerspective(imageA, np.linalg.inv(self.accHomography), (1600, 900))
    return result

imageA是最新的,imageB是下一个。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24563173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档