You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExhaustiveTemplateMatching多模板匹配时矩形仅显示一个的修复咨询

修复多个模板匹配时只绘制一个矩形的问题

嘿,我一眼就发现你代码里的关键问题啦!你现在虽然能检测到所有匹配项,但在绘制矩形的时候,一直引用的是第一个匹配结果(matchings[0]),而不是foreach循环里当前遍历的匹配项m,所以哪怕循环跑了多次,每次画的都是同一个矩形。

错误代码的核心问题

看你这段循环代码:

foreach (TemplateMatch m in matchings)
{
    int X = matchings[0].Rectangle.X;
    int Y = matchings[0].Rectangle.Y;
    g.DrawRectangle(new Pen(Color.Red, 3), X, Y, matchings[0].Rectangle.Width, matchings[0].Rectangle.Height);
    ShowResult.Image = Image;
    MessageBox.Show("Match found!");
}

这里不管循环到哪个m,你始终用matchings[0]的矩形数据,自然只会画出第一个匹配的框。

修正后的完整代码

把循环里的matchings[0]全部换成当前的m,同时可以把ShowResult.Image = Image放到循环外面,避免重复赋值:

Bitmap Temp = new Bitmap(textBox2.Text);
Grayscale OW = new GrayscaleBT709();
Bitmap Template = OW.Apply(Temp);
ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.8f);
Bitmap Image = new Bitmap(textBox1.Text);
Bitmap GrayImage = OW.Apply(Image);

TemplateMatch[] matchings = tm.ProcessImage(GrayImage, Template);
Graphics g = Graphics.FromImage(Image);

// 先判断是否有匹配项,再遍历
if (matchings.Length > 0)
{
    foreach (TemplateMatch m in matchings)
    {
        // 使用当前遍历的m的Rectangle,而不是matchings[0]
        Rectangle rect = m.Rectangle;
        g.DrawRectangle(new Pen(Color.Red, 3), rect.X, rect.Y, rect.Width, rect.Height);
        MessageBox.Show($"Match found! Similarity: {m.Similarity:F2}");
    }
    // 所有矩形画完后再赋值给控件
    ShowResult.Image = Image;
}

额外优化建议

  • 你原来的if (matchings[0].Similarity > 0.8f)其实可以去掉,因为ExhaustiveTemplateMatching构造函数里已经设置了0.8的阈值,返回的matchings数组里的结果都是相似度超过0.8的。
  • 多次弹出MessageBox体验不太好,可以改成在界面上显示匹配数量,或者把所有匹配的相似度输出到日志里。

内容的提问来源于stack exchange,提问作者DarkoMark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:45:07