模板匹配子像素精度

问题描述 投票:0回答:3

我使用模板匹配来检测图像中的特定模式。确定的偏移非常不稳定。目前我将其分别应用于R、G、B通道并对结果进行平均以获得浮点值。请建议如何获得亚像素精度。我打算调整图像大小,然后以原始比例返回数据,请建议任何其他更好的方法。

x_coordinate tracked

我使用Opencv网站上提到的代码“http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

c++ image algorithm opencv image-processing
3个回答
5
投票

我认为根本问题是

minMaxLoc
仅具有像素精度。您可以从此处的讨论中尝试亚像素精确的补丁http://www.longrange.net/Temp/CV_SubPix.cpphttp://answers.opencv.org/question/29665/getting-subpixel- with-matchtemplate/ .

作为一个快速而肮脏的实验,如果亚像素精确的 minMaxLoc 可以解决您的问题,您可以使用三次插值放大模板匹配结果图像(例如,放大 4 倍)

INTER_CUBIC
http://docs .opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html#resize 并在其上应用
minMaxLoc
。 (与线性插值相反,三次插值确实会移动最大值。)

除此之外,您始终可以对输入图像和模板匹配结果应用高斯模糊,以减少高频噪声并抑制局部最大值。

我会先尝试一下快速实验。如果有帮助,您可以集成

minMaxLogSubPix
实现,但这将需要更长的时间。


4
投票

在转向亚像素精度之前先从像素精度开始是一件好事。以亚像素精度检查整个图像将非常昂贵。

一个简单的解决方案可能是拥有 4 个版本的模板。除了基本的之外,还有一个向左移动 1/2 像素,另一个向下移动 1/2 像素,最后一个在两个方向上移动 1/2 像素。当您在

{x,y}
处有匹配时,请检查邻域以查看半移模板是否是更好的匹配。

这个方法的好处是只需要移动小模板即可,而且可以提前完成。

话虽如此,您似乎正在随着时间的推移跟踪对象的位置。对该位置进行低通滤波可能是值得的。


0
投票

我可以提供两种我在实践中测试过的方法

  1. 不要使用模板匹配,而是使用特征匹配,例如 SIFT 或类似的 OpenCV 算法。这些特征检测器确定特征最大值的子像素位置。
  2. 您可以为 matchTemplate 实现类似于 SIFT 的行为。得到minMaxLoc后,获取邻近点处的值并构造局部二次近似,即通过这些点绘制抛物面。您感兴趣的是这个抛物面的极值,即二阶导数变为零的点。

请记住,像素采样会导致混叠效应,即从奈奎斯特-香农定理的角度来看,精确的子像素重建是不可能的,并且频率越高,噪声就越多,因此预先应用一个小的子像素重建是有意义的调整高斯模糊(顺便说一句,这是由 sift 检测器自动执行的)。

© www.soinside.com 2019 - 2024. All rights reserved.