【问题标题】:OpenCV C++ template matching / correlationOpenCV C++ 模板匹配/相关
【发布时间】:2016-09-02 21:37:56
【问题描述】:

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    为什么会耗费时间?

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

    GPU 实现

    GPU 实施可以帮助提高速度,但不能保证。你在 OpenCV 中的 GPU 实现cv::cuda::TemplateMatching

    其他方法

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

    您可以查看this paper 对图像功能的一些评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      相关资源
      最近更新 更多