我使用模板匹配来检测图像中的特定模式。确定的偏移非常不稳定。目前我将其分别应用于R、G、B通道并对结果进行平均以获得浮点值。请建议如何获得亚像素精度。我打算调整图像大小,然后以原始比例返回数据,请建议任何其他更好的方法。
我使用Opencv网站上提到的代码“http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html”
我认为根本问题是
minMaxLoc
仅具有像素精度。您可以从此处的讨论中尝试亚像素精确的补丁http://www.longrange.net/Temp/CV_SubPix.cpp:http://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 个版本的模板。除了基本的之外,还有一个向左移动 1/2 像素,另一个向下移动 1/2 像素,最后一个在两个方向上移动 1/2 像素。当您在
{x,y}
处有匹配时,请检查邻域以查看半移模板是否是更好的匹配。
这个方法的好处是只需要移动小模板即可,而且可以提前完成。
话虽如此,您似乎正在随着时间的推移跟踪对象的位置。对该位置进行低通滤波可能是值得的。
我可以提供两种我在实践中测试过的方法
请记住,像素采样会导致混叠效应,即从奈奎斯特-香农定理的角度来看,精确的子像素重建是不可能的,并且频率越高,噪声就越多,因此预先应用一个小的子像素重建是有意义的调整高斯模糊(顺便说一句,这是由 sift 检测器自动执行的)。