minSAD = VALUE_MAX; // loop through the search image for ( int x = 0; x <= S_rows - T_rows; x++ ) { for ( int y = 0; y <= S_cols - T_cols; y++ ) { SAD = 0.0; // loop through the template image for ( int i = 0; i < T_rows; i++ ) for ( int j = 0; j < T_cols; j++ ) { pixel p_SearchIMG = S[x+i][y+j]; pixel p_TemplateIMG = T[i][j]; SAD += abs( p_SearchIMG.Grey - p_TemplateIMG.Grey ); } } // save the best found position if ( minSAD > SAD ) { minSAD = SAD; // give me VALUE_MAX position.bestRow = x; position.bestCol = y; position.bestSAD = SAD; } }
但这是非常缓慢的做法.我测试了2张图像(768×1280)和子图像(384 x 640).这持续了很久.
openCV是否使用ready函数cvMatchTemplate()更快地执行模板匹配?
解决方法
但是记住它的245’760 x(245’760 x数学运算),所以还有更多的操作.
现在cvMatchTemplate()实际上使用傅立叶分析模板匹配操作.这通过在构成像素的信号强度变化的图像上应用快速傅立叶变换(FFT)被分割成每个相应的波形来起作用.该方法难以很好地解释,但图像被转换为复数的信号表示.如果您想了解更多,请在fast fourier transform的护目镜上搜索.现在,对模板执行相同的操作,形成模板的信号用于过滤掉图像中的任何其他信号.
简单来说,它会抑制图像中与模板没有相同功能的所有功能.然后使用反向快速傅里叶变换将图像转换回来,以产生高值表示匹配的图像,而低值意味着相反.这个图像经常被归一化,所以1代表一个匹配,0或者是关于意味着对象不在附近.
警告,如果他们的对象不在图像中,并且它被归一化将发生错误检测,因为计算的最高值将被视为匹配.我可以继续关于该方法的工作原理及其可能出现的好处或问题,但…
这个方法是如此之快的原因是:1)opencv是高度优化的c代码. 2)对于处理器来说,fft函数很容易处理,因为大多数人都有能力在硬件中执行此操作. GPU图形卡旨在每秒执行数百万次fft操作,因为这些计算与高性能游戏图形或视频编码同样重要. 3)所需的操作量要少得多.
在夏季统计模板匹配方法缓慢而且需要年龄,而opencv FFT或cvMatchTemplate()是快速和高度优化的.
如果一个对象不存在,则统计模板匹配不会产生错误,而opencv FFT除非在其应用程序中得到注意.
我希望这给你一个基本的了解,并回答你的问题.
干杯
克里斯
[编辑]
进一步回答您的问题:
嗨,
cvMatchTemplate可以使用CCOEFF_NORMED和CCORR_NORMED和SQDIFF_NORMED,包括这些的非标准化版本. Here显示了您可以期望的结果,并给出您的代码玩.
http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html#Step%202
这三种方法得到很好的引用,许多论文都可以通过Google scholar.我已经提供了几篇文章.每个人简单地使用不同的方程来找出形成模板的FFT信号和存在于图像内的FFT信号之间的相关性,相关系数倾向于在我的经验中产生更好的结果,并且更容易找到参考.平方差的和是另一种可以与可比较的结果一起使用的方法.我希望其中一些帮助:
Fast normalized cross correlation for defect detection
杜明仔陈霖琳
模式识别函
第24卷,第15期,2003年11月,第2625-2631页
Template Matching using Fast Normalised Cross Correlation
凯伯里奇Uwe D. Hanebeck
Relative performance of two-dimensional speckle-tracking techniques: normalized correlation,non-normalized correlation and sum-absolute-difference
Friemel,B.H. Bohs,L.N. Trahey,G.E.
Ultrasonics Symposium,1995. Proceedings.,1995 IEEE
A Class of Algorithms for Fast Digital Image Registration
巴尼亚,丹尼尔. Silverman,Harvey F.
计算机,IEEE Transactions on 1972年2月
使用这些方法的标准化版本通常是有利的,因为任何等于1的是一个匹配,但是如果不存在对象,则可以获得误报.该方法的工作速度很快,是因为它以计算机语言发起的方式.所涉及的操作对于处理器架构是理想的,这意味着它可以在几个时钟周期内完成每个操作,而不是在几个时钟周期内移动存储器和信息.处理器已经解决FFT问题多年知道,就像我说的内置硬件一样.基于硬件总是比软件快,而且模板匹配的统计方法是基于基础软件.硬件读数可以在这里找到:
Digital signal processor
虽然Wiki页面的引用值得一看,这是执行FFT计算的硬件
A new Approach to Pipeline FFT Processor
寿生他马特·托克森
我的最爱,因为它显示在处理器内发生了什么
An Efficient Locally Pipelined FFT Processor
梁阳;张伟伟刘红霞金黄;黄石坦
这些论文真正展示了FFT实现的复杂程度,但是流程的管道是允许在几个时钟周期内执行操作的.这是基于实时视觉的系统利用FPGA(特别是设计处理器,您可以设计实现一套任务)的原因,因为它们可以在架构中极其平行地进行设计,并且管道更容易实现.
虽然我必须提到,对于图像的FFT,您实际上正在使用FFT2,它是水平平面的FFT和垂直平面的FFT,因此当您找到参考时,没有混淆.我不能说我有一个专家知识如何实现和FFT实现我已经尝试找到好的指南,但找到一个好的指南是非常困难的,我还没有找到一个(没有一个我可以理解最小).有一天我可以理解他们,但是知道我对他们的工作方式有很好的了解以及可以预期的结果.
除此之外,如果您想要实现自己的版本或了解它是如何工作的时候,我不能真正帮助你更多的时间到图书馆,但我警告你,opencv代码是如此优化,你将努力提高其性能,但谁知道你可能会找出一种获得更好结果的方法,祝你好运
克里斯