我正在尝试基本上在 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代码是如此优化,你将努力提高其性能,但谁知道你可能会找出一种获得更好结果的方法,祝你好运

克里斯

java – OpenCV在模板匹配上的表现的更多相关文章

  1. iOS使用openCV检测来自摄像头的矩形

    如果我在处理它之前克隆matimage,通过记录它,它似乎处理图像甚至找到矩形,但矩形不会被绘制到图像输出到imageView.我很确定我错过了一些东西,可能是因为我没有正确传递某个对象,指向对象的指针等等,而我需要修改的对象则没有.无论如何,如果这不是正确的方法,我真的很感谢他们做这样的事情的教程或例子,使用openCV或GPUImage…它不需要尝试使用matimage来设置imageView.image,而只需要将matimage转换为在imageView中实际修改,因为CvVideoCamera已

  2. 使用Xcode为OS X Lion / Mountain Lion编译OpenCV(2.3.1)

    任何人都可以为我提供一些如何使用Xcode在OSXLion上编译OpenCV2.3.1的详细指南吗?我对此感到生气…我得到了源码,使用cmake创建Xcode模板并尝试构建它,但它失败了大约200个错误.提前致谢,大教堂解答我的回答帖子.解决方法详细指南如何使用MacPorts在Xcode4.2.1的OSXLion下启动和运行OpenCV2.3.1编辑08/06/2012:这也适用于OpenCV2.4.1.只需确保您获得最新版本的Xcode并安装“命令行工具”.编辑15/08/2012:使用Mountai

  3. ios – OpenCV构建问题,找不到ext/atomicity.h

    我得到编译器错误抱怨在构建包含OpenCV的项目时.环境是针对iOS的Xcode4.5.它为模拟器编译良好,但在为设备构建时失败.这是错误文本:我正在使用opencv2.framework,使用指令here构建cmake.解决方法默认情况下,XCode4.5使用libc(支持C11的LLVMC标准库)生成要构建的新项目.但OpenCV期望针对GNUlibstd

  4. 从IOS / iPad / iPhone的最大速度

    我使用OpenCVforiOS完成计算密集型应用程序.当然这很慢.但它比我的PC原型慢了200倍.所以我正在优化它.从最初的15秒,我能够获得0.4秒的速度.我想知道我是否找到了所有的东西以及别人想要分享的东西.我做了什么:>将OpenCV中的“double”数据类型替换为“float”.双倍是64位,32位cpu不能轻易处理,所以浮动给了我一些速度.OpenCV经常使用双倍.>为编译器选项添加了

  5. 用swift和Accelerate的快速傅里叶变换(FFT)来实现对波形的整形

    Swift提供了一个机会,通过方法重载或为Accelerate框架进行包装后,可以让交互更加容易。Accelerate框架提供了另一个解决方案,叫做快速傅里叶变换,关于这个方案这里有一个很好的解释。我们在例子AccelerateFunctions.playground中实现了这个原型,你可以对照这个例子来看下面的内容。从这里开始Accelerate将帮助我们完成工作。这里我们要使用到Accelerate的vDSP库,它正好有这类功能的方法。

  6. 在Swift iOS中使用OpenCV

    在我的xcode项目中添加OpenCV2框架后,我试图搜索samlpes或教程与swift集成。有什么好的教程同样吗?OpenCV是用C编写的框架。苹果的reference告诉我们YoucannotimportC++codedirectlyintoSwift.Instead,createanObjective-CorCwrapperforC++code.所以你不能在一个swift项目中直接导入和使用OpenCV,但这实际上并不坏,因为你(需要)继续使用框架的C语法,这是在网络上有很多文档。那么你怎么进行呢

  7. 在Android Studio中解决已弃用的NDK警告

    或者除了添加所有已编译的代码并设置我之前提到的标志之外,还有其他方法可以将OpenCV导入Android项目吗?任何有关这方面的帮助将不胜感激.解决方法我建议迁移到使用cmake的本机支持.您可以查看链接,该链接提供了使用cmake通过以下link添加OpenCV的分步教程.您的代码应该保持不变而不做任何更改,只有必要的操作才能弄清楚如何使用CMakeLists.txt将它们包含在构建过程中.

  8. android – opencv管理器包没找到?如何自动安装?

    我正在使用openCV,每当我运行代码时它都会给我包管理器没有安装,那么如何通过我的应用程序安装它.是必须从Play商店下载它还是我们可以在设备中自动安装它.请帮我.提前致谢.解决方法您需要使用静态初始化来包含apk中的所有OpenCV二进制文件.请参阅此文档:ApplicationDevelopmentwithStaticInitialization

  9. 如何从Android相机中找到框架的轮廓并将其转换为box2d实体?

    使用openframeworks,OpenCV和Box2D,我能够以良好的帧速率实现它.使用Android似乎是一项更复杂的任务(部分原因是我是JAVA新手).这就是我的开始:>使用“OpenCV示例–图像处理”并删除除“canny”效果之外的所有内容,这会产生一个漂亮的黑色&白色图像,非常适合找到轮廓.>从“OpenCVSample–color-blob-detection”中我抓住了在Mat中

  10. Android:如何移动输出声音的音高(实时)

    我是Android开发的新手.我正在寻找任何将音高变换应用于输出声音的方法(实时).但我找不到任何开始的意义.我发现这个topic,但我仍然不知道如何应用这个.有什么建议?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部