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
相关产品推荐
相关产品推荐

