java – OpenCV在模板匹配上的表现
我正在尝试基本上在
java上做模板匹配.我使用直接的算法找到匹配.这是代码:
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 cvMatchTemplate()比你实现的方法要快很多.您创建的是统计模板匹配方法.这是最常见的,最简单的实现,但是在大图像上是非常慢的.让我们来看看你有一个768×1280的图像的基本数学,你循环遍历每个像素减去边缘,因为这是你模板限制所以(768 – 384)x(1280 – 640),384 x 640 = 245’因此,在您在循环中添加任何数学(245’760 x 245’760)60’397’977’600操作之前,您可以循环遍历模板的每个像素(另外245’760个操作).超过600亿的操作只是为了循环您的形象更令人惊讶的是,多快的机器可以做到这一点.
但是记住它的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 Template Matching using Fast Normalised Cross Correlation Relative performance of two-dimensional speckle-tracking techniques: normalized correlation,non-normalized correlation and sum-absolute-difference A Class of Algorithms for Fast Digital Image Registration 使用这些方法的标准化版本通常是有利的,因为任何等于1的是一个匹配,但是如果不存在对象,则可以获得误报.该方法的工作速度很快,是因为它以计算机语言发起的方式.所涉及的操作对于处理器架构是理想的,这意味着它可以在几个时钟周期内完成每个操作,而不是在几个时钟周期内移动存储器和信息.处理器已经解决FFT问题多年知道,就像我说的内置硬件一样.基于硬件总是比软件快,而且模板匹配的统计方法是基于基础软件.硬件读数可以在这里找到: Digital signal processor A new Approach to Pipeline FFT Processor An Efficient Locally Pipelined FFT Processor 这些论文真正展示了FFT实现的复杂程度,但是流程的管道是允许在几个时钟周期内执行操作的.这是基于实时视觉的系统利用FPGA(特别是设计处理器,您可以设计实现一套任务)的原因,因为它们可以在架构中极其平行地进行设计,并且管道更容易实现. 虽然我必须提到,对于图像的FFT,您实际上正在使用FFT2,它是水平平面的FFT和垂直平面的FFT,因此当您找到参考时,没有混淆.我不能说我有一个专家知识如何实现和FFT实现我已经尝试找到好的指南,但找到一个好的指南是非常困难的,我还没有找到一个(没有一个我可以理解最小).有一天我可以理解他们,但是知道我对他们的工作方式有很好的了解以及可以预期的结果. 除此之外,如果您想要实现自己的版本或了解它是如何工作的时候,我不能真正帮助你更多的时间到图书馆,但我警告你,opencv代码是如此优化,你将努力提高其性能,但谁知道你可能会找出一种获得更好结果的方法,祝你好运 克里斯 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |