java – OpenCV在模板匹配上的表现

前端之家收集整理的这篇文章主要介绍了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是否使用ready函数cvMatchTemplate()更快地执行模板匹配?

解决方法

你会发现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
杜明仔陈霖琳
模式识别函
第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代码是如此优化,你将努力提高其性能,但谁知道你可能会找出一种获得更好结果的方法,祝你好运

克里斯

原文链接:https://www.f2er.com/java/122290.html

猜你在找的Java相关文章