- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试基本上在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;
}
}
最佳答案
您会发现 openCV cvMatchTemplate() 比您实现的方法快得多。您创建的是一种统计模板匹配方法。它是最常见和最容易实现的,但是在大图像上非常慢。让我们来看看基本的数学运算,你有一个 768x1280 的图像,你遍历每个像素减去边缘,因为这是你的模板限制,所以 (768 - 384) x (1280 - 640) 384 x 640 = 245' 760 次操作,其中循环遍历模板的每个像素(另外 245'760 次操作),因此在您在循环中添加任何数学之前,您已经拥有 (245'760 x 245'760) 60'397'977'600 次操作。超过 600 亿次操作仅用于遍历您的图像 更令人惊讶的是机器可以执行此操作的速度之快。
但是请记住它的 245'760 x (245'760 x Maths Operations) 所以还有更多的运算。
现在 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
凯·布里切尔;乌维·D·哈内贝克;
Relative performance of two-dimensional speckle-tracking techniques: normalized correlation, non-normalized correlation and sum-absolute-difference
弗里梅尔,B.H.; Bohs, L.N.; Trahey, G.E.;
超声波研讨会,1995 年。 session 录。,1995 年 IEEE
A Class of Algorithms for Fast Digital Image Registration
巴尼亚,丹尼尔一世;西尔弗曼,哈维 F.;
计算机,IEEE Transactions,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 在模板匹配上的表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7139606/
我正在用 C++ 开发一个程序,我必须实现一个 cron。由于不同的原因,这个 cron 应该每小时和每 24 小时执行一次。我的第一个想法是创建一个独立的 pthread 并在每次 1h 内休眠。这
我需要向同一场景几何添加多个体素(立方体等于),但每个体素具有不同的纹理。 我的体素超过 500 个,导致性能出现严重错误。 这是我的代码: texture = crearTextura(voxel.
对于 MySQL 数据库,我有 2 个场景,我不确定该选择哪一个,并且对于一些表我也遇到了同样的困境。 我正在制作一个仅供成员(member)访问的网络应用程序。每个成员都有自己的交易、费用和“列表”
我想知道一个简单的事情: 当设置一个被所有 child 继承的样式时,是否建议最具体? Structure: html > body > parent_content > wrapper > p 我想
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
这些天我正在阅读有关 JPA 的内容。我了解到可以在 JPQL 中使用 explicit 或 implicit JOIN。 显式加入 em.createQuery(“SELECT b.title, p
我有一种情况需要连接几个字符串以形成一个类的 id。基本上,我只是在列表中循环以获取对象的 ToString 值,然后将它们连接起来。 foreach (MyObject o in myList)
我正在检查我的游戏在拖尾效果下的性能会降低多少。但我注意到每秒的操作次数更多了。这怎么可能? 这是怎么回事... context.fillRect(0, 0, 500, 500); // cl
如果我可以选择使用全局变量或传递变量,哪个选项在速度和内存使用方面更好? // global variable function func(){ global $var; echo $var;
我有一个类似这样的表“tbl”:ID bigint(20) - 主键,自增字段1字段2字段3 该表有 60 万多行。 查询:SELECT * from tbl ORDER by ID LIMIT 60
谁能告诉我,我如何比较 TSP 最优和启发式算法?我已经实现了 TSP,但不知道如何比较它们。事实上,我怎样才能找到 TSP 的最优成本?有什么方法或猜测吗? 谢谢 最佳答案 用众所周知的基准实例检查
我有一个 NSTextStorage里面有长文本(比如一本书有 500 页,当前字体在设备上超过 9000 页)。我以这种方式为 textcontainer 分发此文本: let textStorag
我有一个根据邮政编码搜索项目的应用程序。 在搜索邮政编码时,我返回了来自该城市/社区的所有产品(通过解析邮政编码完成)。 我现在需要根据与原始邮政编码的距离对这些产品进行分类。 我将纬度/经度存储在数
我有许多进程(大约100到1000个进程),每个进程都必须向其他进程(例如大约10个)发送一些数据。 (通常,但不一定总是这样,如果A发送给B,B也发送给A。)每个进程都知道必须从哪个进程接收多少数据
我知道无状态组件使用起来更舒服(在特定场景下),但是既然你不能使用shouldComponentUpdate,这是否意味着组件将在每次props更改时重新渲染?我的问题是,使用带有智能 shouldC
我正在研究 Google Pagespeed 的加速页面加载时间指南列表。其中之一是缩小 CSS 和 JS 文件。 由于这些文件经常更改,我正在考虑使用 PHP 脚本根据请求(来自浏览器)即时缩小此脚
我正在尝试从下表构建 SQL 查询(示例): Example of table with name "performances" 这是带有运动表现的表格。我想从这个表中选择每个学科和一组一个或多个类别
假设我们有一个字符串 var "sA",我想检查字符串 "123"是否在 sA 的末尾。 什么更好,为什么: if(sA.length() > 2) sA.substr(sA.length()-3)
关于受这篇文章启发的可参数化查询 LINQ group by property as a parameter我获得了一个很好的参数化查询,但在性能上有一个缺点。 public static void
| 和| 之间有什么主要区别吗?和 + 从长远来看会影响代码的性能吗?或者都是 O(1)?我正在使用的代码是这样的: uint64_t dostuff(uint64_t a,uint64_t b){
我是一名优秀的程序员,十分优秀!