在cpp中使用FFT进行图像配准(可选择使用OpenCV)?

5
我试着调整两张由手持相机拍摄的图片的对齐。一开始,我尝试使用基于SIFT/SURF特征点的OpenCV "warpPerspective"方法。问题是当图像质量高时(3000x4000),特征提取和匹配过程可能非常慢。我尝试在查找特征点之前缩小图像,结果不如以前。(从“findHomography”生成的“Mat”不应受到缩小图像的影响,对吧?)有时,由于缺乏良好的特征点匹配,结果相当奇怪。
在此主题上搜索后,似乎在傅立叶领域解决问题将加速注册过程。我找到了这个问题,它引导我到这里的代码
唯一的问题是代码是用numpy编写的Python代码(甚至没有使用OpenCV),这使得将其重写为使用OpenCV的C++代码非常困难(在OpenCV中,我只能找到“dft”,而没有“fftshift”或“fft”等内容,我对NumPy不太熟悉,并且不敢简单地忽略缺少的方法)。所以我想知道为什么没有使用C++实现的傅里叶域图像配准?
你们能否给我一些关于如何实现此功能的建议,或者给我一个已经实现的C++版本的链接?或帮助我将Python代码转换成C++代码?
非常感谢!
2个回答

3
我相信FFT方法只能恢复相似变换,即(2D)旋转、平移和缩放。使用手持相机可能会导致结果不太好。
这并不是直接回答您的问题,但作为加速改进的建议,您是否尝试过使用更快的特征检测器和描述符?在OpenCV中,SIFT / SURF是特征提取/匹配中最慢的方法之一。您可以先尝试测试一些其他方法,它们都能很好地工作且比SIFT / SURF更快,特别是如果您使用它们的FLANN匹配程序。
我以前也曾经尝试过使用类似大小的图像,并且使用OpenCV的二进制描述符显著提高了速度。

我同意 - 在傅里叶空间中进行相关性分析对于简单的平移最为适用,对于旋转来说还可以接受,但是对于尺度而言则非常困难,而在投影方面几乎没有用处。赞一个,因为你试图回答“真正”的问题。 - Roger Rowland
谢谢David,我决定尝试其他的提取器。我想知道在图像配准方面,你最喜欢哪种探测器/提取器组合? - Void Main
这取决于图像内容,我在从接近相同视角拍摄的图像上使用FAST/FREAK取得了很大的成功。我也尝试过使用ORB,它有更多的错误匹配,但是非常快速,在去除异常值后表现接近SIFT。 - David Nilosek
《ORB论文》指出ORB在户外图片上的表现更好。此外,没有一个特征匹配器能够返回完美的结果。在99%的情况下,您必须对匹配的关键点执行额外的过滤以过滤掉不正确的点。您可以使用RANSAC来实现这个目的,它的表现相当不错,结果非常好。 - rbaleksandar

1

如果您只需要进行平移操作,可以使用OpenCV的phasecorrelate函数。


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