【问题标题】:image processing using template matching approach使用模板匹配方法的图像处理
【发布时间】:2014-06-03 16:35:50
【问题描述】:

我正在做一个与模板匹配图像处理相关的项目,我已经完成了匹配算法,但我面临的问题是,模板匹配器总是产生与模板图像的源图像匹配的最佳关联关系,但我想仅当所需的输出既不是错误输出时才通知或响应。我想用 arduino 板 UNO R3 串行通信 MATLAB 代码,它会在输出到来时产生双向脉冲?那我该怎么办? 这是代码:

cam=videoinput('winvideo',2,'YUY2_320x240');


start(cam);
preview(cam);
set(cam,'ReturnedColorSpace','RGB');
get=input('get frame ???');

frame=getsnapshot(cam);
imwrite(frame,'got.jpg');

I=imread('D:\Template matcher\got.jpg');
H_Eq=vision.HistogramEqualizer;
Temlate_matcher=vision.TemplateMatcher;
Temlate_matcher.Metric='Maximum absolute difference';
Temlate_matcher.OutputValue='Metric matrix';
marker_inserter=vision.MarkerInserter('Size',30,'Fill',false,'FillColor','White','Opacity',0.75);
I=rgb2gray(I);
I=step(H_Eq,I);
Template1=imread('D:\Template matcher\ge.jpg');


Template1=rgb2gray(Template1);


H_Eq=vision.HistogramEqualizer;
Template1=step(H_Eq,Template1);


Location1=step(Temlate_matcher,I,Template1);

 marker_inserter.Shape='Square'
 output_image=step(marker_inserter,I,Location1);

figure();imshow(output_image);

【问题讨论】:

  • 您始终可以设置一个阈值,例如最好的分数是 80% 或更高。如果您的模板匹配分数高于此阈值,那么这应该非常表明匹配良好,您可以向您的 Arduino 板发出信号,表明您找到了有价值的东西。
  • 需要更多解释,因为我不熟悉阈值
  • 您在问题中指出,当您进行模板匹配时,输出将是与最佳得分的相关性。有时,最好的分数可能很差……大概是 30%。这意味着即使获得了这个最高分数,您也不太可能找到了您正在寻找的对象。这就是为什么强制实施阈值是个好主意。当您找到最佳分数时,如果该分数高于某个阈值(例如 80%),那么这可能表明该对象确实在图像中。
  • 因此,使用您的相关分数,并检查它是否高于某个阈值。如果是,那么对象就在那里(希望如此),如果不是,那么它不应该存在(希望如此!)。
  • 这对我来说是可以理解的,但我使用模板匹配器、直方图均衡器等内置功能并以灰度处理图像,那么我该如何设置阈值呢?在 MATLAB 2012 中

标签: matlab templates image-processing arduino template-matching


【解决方案1】:

正如我们在 cmets 中所讨论的,使用计算机视觉工具箱的模板匹配将在帧中产生 最佳 模板匹配。但是,这并不一定意味着您要搜索的对象位于模板最匹配的位置。

因此,我建议您查看该指标为您提供的该模板的内容。在您的情况下,您使用的是最大绝对差。如果此指标小于某个阈值,则可能意味着在您正在检查的框架中找到了模板。如果它更大,那么很有可能它不是。这个阈值你必须玩弄,因为它完全取决于模板的外观和你试图查看的框架的内容。如果它小于某个阈值,那么您可以将信号发送到 Arduino 板。在我们这样做之前,您必须更改您的模板匹配器设置,使其看起来像这样:

Temlate_matcher=vision.TemplateMatcher('OutputValue', ...
                'Best match location', 'BestMatchNeighborhoodOutputPort', true);

这将使我们能够得到我们最终想要的东西。 因此,您不能再将Metric Matrix 用作OutputValue 字段,因此请在您的代码中删除这一行。现在已经设置好了,您可以通过替换以下代码来覆盖模板匹配的行为:

Location1=step(Temlate_matcher,I,Template1);

有了这个:

[Location1, NVALS, NVALID] = step(Temlate_matcher,I,Template1);

NVALID 如果匹配完全包含在框架内,则返回 true,否则返回 false。对于您的情况,NVALID 应该始终为真,因为只要模板包含在框架中,您选择的指标就可以保证匹配。 NVALS 是与模板图像最匹配的度量值矩阵。本质上,这个矩阵的 中心 为您提供了匹配器产生的最佳度量值,因此这就是您想要的值。您可以作弊并通过以下方式找到最小值:

val = min(NVALS(:));

因此,在这一点之后,您可以检查val 是否小于某个阈值。这我不知道会是什么。我想可以玩的东西是,如果最好的比赛是……比如说5,那么框架中可能会有一些有趣的东西可以看。因此,设置thresh = 5

因此,如果 val 小于 thresh,则继续向您的 Arduino 板发送信号。

祝你好运!

【讨论】:

  • 错误使用 vision.TemplateMatcher/step 输出参数太多;必须介于 1 和 1 之间(请求 3)。 TM 中的错误(第 32 行)[LOC, NVALS, NVALID] = step(Template_matcher,I,Template1);这就是我面临的错误
  • 不应该发生。我是直接从文档中得到的。输入help vision.TemplateMatcher,你会看到
  • 是的,我在帮助中查看了它。语法相同,但它声明输出参数的错误是 3 应该是 1 和 1
  • @user3703949 请再次阅读文档。您需要以不同的方式设置模板匹配器。检查我的编辑。
  • @user3703949 :我还编辑了如何计算阈值。也检查一下。
猜你喜欢
  • 2011-02-24
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多