嗨,我看过很多教程,如何使用两张照片进行简单的图像拼接,这是没有问题的。
但是,当我想要从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缝合到当前全景图中,但在这里我在全景图像中得到了非常明显的间隙,当下一张图像被缝合时,它的间隙更大,图像非常拉伸。
有人能告诉我我是否使用了正确的方法吗?或者有人能发现错误或看到我做错了什么吗?
发布于 2014-07-04 07:13:35
一步一步,假设你想拼接四个图像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,etc...I1对齐的H_1 = I1图像例如I3I1= H_3 = H_1 * inv(H_13) = inv(H_13) =更好地匹配I1或I3的I2图像例如匹配D41= H_3 * H_23H145
请参阅这篇开创性论文Automatic Panoramic Image Stitching using Invariant Features的第4节以获得深入的解释。
发布于 2014-07-04 06:48:44
Hacky方法
考虑到你编写的函数,最简单的方法(虽然不是非常有效)就是通过将全景图像与每个连续的图像进行拼接来增长全景图像。类似于下面的伪代码:
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,特别是“变换的组合”部分。
发布于 2017-07-07 22:43:25
图像之间的间隙也有类似的问题。你应该做的第一件事是初始化你累积的单应性矩阵以在第一帧识别。然后,对于每一个新的帧,你应该将它乘以当前帧和下一帧之间的单应矩阵。注意使用numpy矩阵,而不是numpy数组。我不知道为什么,但它们有不同的乘法例程。
下面是我的代码:
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 resultimageA是最新的,imageB是下一个。
希望这能有所帮助。
https://stackoverflow.com/questions/24563173
复制相似问题