0

我正在做一个与模板匹配图像处理相关的项目,我已经完成了匹配算法,但我面临的问题是,模板匹配器总是产生与模板图像的源图像匹配的最佳相关性,但我想通知或响应仅当所需的输出既不是错误输出时。我想用 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);
4

1 回答 1

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应该始终为真,因为只要模板包含在框架中,就可以保证您选择的指标进行匹配。 NVALS是与模板图像最匹配的度量值矩阵。本质上,该矩阵的中心为您提供了匹配器产生的最佳度量值,因此这就是您想要的值。您可以作弊并通过以下方式找到最小值:

val = min(NVALS(:));

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

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

祝你好运!

于 2014-06-03T20:21:03.270 回答