【问题标题】:Finding all matches with matchtemplate opencv opencvsharp使用 matchtemplate opencv opencvsharp 查找所有匹配项
【发布时间】:2015-01-12 23:07:16
【问题描述】:

我正在使用带有 opencvsharp 的 opencv。

当做一个匹配模板和之后 minmaxloc 我只得到第一个匹配。如何获得所有匹配项?

            Cv.MatchTemplate(tempImg, templateSymbol.Img, resImg, MatchTemplateMethod.CCorrNormed);
            double min_val, max_val;
            Cv.MinMaxLoc(resImg, out min_val, out max_val);
            if (max_val > 0.5)
            {

                symbolsFound.Add(templateSymbol.Description);
                Console.WriteLine(templateSymbol.Description);
            }

我只找到第一个匹配项,我知道还有更多匹配项。

【问题讨论】:

    标签: image-processing opencv opencvdotnet


    【解决方案1】:
    try
            {
    
                IplImage tpl = Cv.LoadImage("template path", LoadMode.Color);
                IplImage img = Cv.LoadImage("main image path", LoadMode.Color);
    
                IplImage res = Cv.CreateImage(Cv.Size(img.Width - tpl.Width + 1, img.Height - tpl.Height + 1), BitDepth.F32, 1);
                Cv.MatchTemplate(img, tpl, res, MatchTemplateMethod.CCoeffNormed);
    
                Cv.Threshold(res, res, 0.9, 255, ThresholdType.ToZero);
    
                while (true)
                {
                    CvPoint minloc, maxloc;
                    double minval, maxval, threshold = 0.95;
    
                    Cv.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc, null);
                    if (maxval > threshold)
                    {
                        Console.WriteLine("Matched " + maxloc.X + "," + maxloc.Y);
                        Cv.FloodFill(res, maxloc, new CvScalar());
                    }
                    else
                    {
                        Console.WriteLine("No More Matches");
                        break;
                    }
                }
    
                Cv.ReleaseImage(res);
                Cv.ReleaseImage(img);
    
    
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
    

    【讨论】:

      【解决方案2】:

      请参阅我的其他答案here,我将在其中展示如何完全按照您的要求进行操作。它是用 C++ 编写的,但移植到 C# 应该相当简单。不要使用std::queue,而是使用.NET Queue

      基本上,您需要扫描您的resImg 以查找所有最大(或最小,取决于比较算法)点,并在某种容器(列表、队列、优先级队列)中记录尽可能多的点, ETC...)。 MinMaxLoc 只会返回顶级匹配,这就是为什么你只会得到一个匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-31
        • 2012-09-01
        相关资源
        最近更新 更多