使用模板匹配方法的图像处理

时间:2014-06-03 16:35:51

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

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

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);

1 个答案:

答案 0 :(得分:0)

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

因此,我建议您做的是查看指标为该模板提供的内容。在您的情况下,您使用的是最大绝对差值。如果此指标 超过某个阈值,那么这可能意味着在您正在检查的框架中找到了该模板。如果它更大,那么它很可能不是。您必须使用此阈值,因为它完全取决于模板的外观以及您尝试查看的帧的内容。如果它低于某个阈值,那么您可以将信号发送到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应始终为true,因为只要模板包含在框架中,您选择的指标就可以保证匹配。 NVALS是与模板图像最匹配的度量值矩阵。实质上,此矩阵的 center 为您提供匹配器生成的最佳度量值,因此这是您想要的值。你可以欺骗并找到最小值:

val = min(NVALS(:));

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

因此,如果val小于thresh,请继续向您的Arduino电路板发出信号。

祝你好运!