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

你已经看了很多教程如何使用两张照片做简单的图像拼接,这是没有问题的。
但是当我想从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函数从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

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


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

  • 计算H_01,H_02,H_03,H_12,H_13,H_23的所有成对性别单应性,其中单应性H_01将图像I0翘曲成I1等。
  • 选择一个锚图像,例如I1哪个位置将保持固定,即H_1 =身份
  • 根据一致匹配的最大数量(例如I3)查找更好地与I1对齐的图像
  • 更新H_3 = H_1 * inv(H_13)= inv(H_13)= H_31
  • 查找更符合I1或I3的图像,例如I2匹配I3
  • 更新H_2 = H_3 * H_23
  • 图像I0与上面相同
  • 做捆绑调整以全局优化对齐
  • 有关深入的解释,请参阅本文的第4部分https://www.cs.bath.ac.uk/brown/papers/ijcv2007.pdf。


    哈克方法

    考虑到您所写的功能,最简单的方法(尽管不是非常高效)只是通过将每幅连续图像拼接来生成全景图像。 像这样的伪代码:

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

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

    数学方法

    另一种选择是,如果您知道要缝合的顺序,则需要从一幅图像到另一幅图像找到Homography,然后将它们相乘。 结果是从该图像到图像0的Homography。

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

    有关为什么要增加变换的背景,请参阅:https://www.math.lsu.edu/~verrill/teaching/linearalgebra/linalg/linalg5.html,特别是“变形构成”部分。


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

    这是我的代码:

    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是下一个。

    希望这可以帮助。

    链接地址: http://www.djcxy.com/p/29163.html

    上一篇: Stitch multiple images using OpenCV (Python)

    下一篇: Comparison between two images in MATLAB