拼接航拍图像

5

我正在尝试将两张航拍图片拼接在一起,重叠区域很小,可能只有不到500像素的重叠。这些图片的分辨率为3600x2100。我使用OpenCV库来完成这个任务。

以下是我的方法:

1. Find feature points and match points between the two images.
2. Find homography between two images
3. Warp one of the images using the homgraphy
4. Stitch the two images

目前我正在尝试使用两个图像来完成这项工作。我在第三步和可能的第二步遇到了麻烦。我使用OpenCV库中的findHomography()获取了两个图像之间的单应性矩阵。然后,我使用该单应性矩阵对其中一个图像调用了warpPerspective()

这种方法的问题是转换后的图像变形严重。而且似乎只转换了图像的一部分。我不知道为什么它没有转换整个图像。

有人能给我一些关于如何解决这个问题的建议吗?
谢谢


能否发布一个缩小版本的结果? - bjoernz
以下是我的测试结果。谢谢。 http://imageshack.us/f/689/test2yz.png/ http://imageshack.us/f/16/test1uf.png/ - Hien
这些图像一开始就很糟糕。这里有一些重叠度稍高的测试图像。彩色点是匹配点。结果 - Hien
3个回答

3
在您发布的结果中,我可以看到至少有一个关键点不匹配。如果您使用findHomography(src,dst,0),它会破坏您的单应性矩阵。您应该使用findHomography(src,dst,CV_RANSAC)
您还可以尝试使用warpAffine而不是warpPerspective编辑:在您在问题的评论中发布的结果中,我印象深刻的是匹配效果相当稳定。这意味着您也应该能够使用示例获得良好的结果。由于您似乎大多数情况下都需要处理平移,因此可以尝试使用以下草图算法过滤掉异常值:
1. 计算平均(或中位数)运动向量x_avg 2. 计算归一化点积<x_avg,x_match> 3. 如果点积小于阈值,则丢弃x_match

在你提到这个之后,我尝试了几对有更大重叠区域的图像,结果非常好。我想在我找到一种方法使其适用于重叠区域较小的图像之前,这将是必须的。谢谢。 - Hien
我有一段时间没用向量了,所以我对你所说的那个阈值有点困惑。既然我们要将归一化点积与阈值进行比较,那么在这种情况下应该选用什么样的阈值呢?我知道归一化点积小于等于1,那么当阈值为0.5时是什么意思呢?谢谢。 - Hien
通过将两个归一化向量相乘,您可以得到这些向量之间夹角的余弦值。也许维基百科页面可以帮助您进行可视化:http://en.wikipedia.org/wiki/Dot_product 。因此,您可以说小于0.7(例如)的所有内容都是异常值。 - bjoernz

1

如果要让它适用于重叠度较小的图像,您需要查看检测器、描述符和匹配项。虽然您没有指定使用哪些描述符,但我建议使用SIFT或SURF描述符及相应的检测器。您还应该设置检测器参数以进行密集取样(即尝试检测更多特征)。

您可以参考以下略微相关的答案:OpenCV - Image Stitching


我目前正在使用SURF描述符和检测器。虽然SIFT的结果更好,但它比SURF慢得多,所以我避免使用它。我的项目最初是将数百张图像拼接在一起创建地图,因此我使用了SURF,它给出了不错的结果,并且比SIFT快得多。 - Hien
在这种情况下,请尝试调整检测器以获得点的密集采样。 - KMS

0
使用单应性照片拼接时,最重要的是在两张图片中找到对应点。对应点中异常值越少,生成的单应性就越好。使用鲁棒技术,如RANSAC和OpenCV的FindHomography()函数(使用CV_RANSAC选项),只要内点的百分比大于外点的百分比,仍然会生成合理的单应性。同时确保传递给FindHomography函数的对应点中至少有4个内点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接