缩放和旋转模板匹配

时间:2012-05-19 15:16:25

标签: c++ image-processing opencv computer-vision template-matching

我正在使用匹配模板的方法与CV_TM_CCORR_NORMED来比较两个图像......我想制作这个旋转并缩放不变的...任何想法?

我尝试在图像和模板的傅立叶变换上使用相同的方法,但旋转后的结果仍然不同

3 个答案:

答案 0 :(得分:34)

在场景中旋转或缩放对象时,与matchTemplate匹配的模板效果不佳。

您应该尝试Features2D Framework中的openCV函数。例如SIFTSURF描述符和FLANN匹配器。此外,您还需要findHomography方法。

Here是在场景中找到旋转对象的一个​​很好的例子。

<强>更新

简而言之,算法就是这样:

  1. 查找对象图像的关键点 1.1。从这些关键点中提取描述符

  2. 查找场景图像的关键点 2.1从关键点提取描述符

  3. 按匹配器匹配描述符

  4. 分析您的比赛

  5. 有不同类别的FeatureDetectors,DescriptorExtractors和DescriptorMatches,您可以阅读它们并选择适合您任务的那些。

答案 1 :(得分:6)

轮换不变

对于每个关键点:

  1. 占据关键点周围的区域。
  2. 使用渐变或其他方法计算此区域的方向角。
  3. 将此角度的图案和请求区域旋转为0。
  4. 计算此旋转区域的描述符并匹配它们。
  5. 缩放不变

    请参阅BRISK方法

答案 2 :(得分:4)

匹配模板刻度和旋转不变的方法比通过特征检测和单应性更容易(如果你知道它真的只旋转和缩放,但其他一切都是不变的)。 对于真实物体检测,上述建议的基于关键点的方法效果更好。

如果您知道它是相同的模板并且没有涉及透视变化,您可以使用图像金字塔进行缩放空间检测,并在该金字塔的不同级别上匹配您的模板(通过简单的东西,例如SSD或NCC )。在金字塔的较高(=较低分辨率)水平上找到粗略匹配将是便宜的。实际上,它会如此便宜,您也可以在低分辨率级别上大致旋转模板,当您将模板追溯到更高的分辨率级别时,您可以使用更精细的旋转步进。这是一种非常标准的模板匹配技术,在实践中运行良好。