OpenCV C ++模板匹配/关联

时间:2016-09-02 21:37:57

标签: c++ opencv correlation convolution template-matching

我有以下问题: 如下图所示,我有一个900x900px源图像和一个较小的300x300px模板图像。现在我需要计算源图像的任意子部分和模板图像的旋转图像之间的相关性。给出了旋转角度(phi)以及子部分(x,y)的坐标,我只需要计算相关性。但是我需要经常对x,y和phi的不同组合重复整个操作。

sketch

我打算使用opencv(3.1版)来完成这项任务。因为我需要针对相同的源和模板图像重复x,y和phi的不同组合的操作,所以我正在寻找一种非常快速的解决方案。 目前,我使用warpAffine()旋转给定角度的模板,然后使用matchTemplate()函数计算相关性。 然而matchTemplate()似乎计算更多的卷积而不是简单的相关性,我想我错过了它。 matchTemplate()部分也是我程序的瓶颈。 你知道如何提高速度吗? 在这种情况下使用图形加速是否有用? 或者在执行关联之前存储我的图像的dft转换版本是否有用? 或者你有完全不同的想法?

由于

1 个答案:

答案 0 :(得分:1)

为什么要耗费时间?

图像中的这种类型的扫描是耗时的,因为具有不同可能性的扫描次数(例如,模板可以每2度旋转一次,然后再次扫描整个图像并重复。您可以看到增长解决方案空间的可能性)。此外,扫描步幅的选择有助于增加搜索时间,但由于跳跃间隔较大,可能会错过最佳解决方案。

GPU实施

GPU实现可以帮助提高速度,但不能保证。您是OpenCV cv::cuda::TemplateMatching

中的GPU实现

其他方法

根据您的模板类型,即纹理或无纹理等,您可以仔细制作尺度不变的特征,例如SIFT,它将比密集模板匹配相对更快。由于图像尺寸很大,实时SIFT检测将很困难,但我可以保证它会比你现在使用的方法更快。

您可以在某些图片功能评论中查看this paper