Поиск всех совпадений с помощью matchtemplate opencv opencvsharp - PullRequest
6 голосов
/ 03 февраля 2012

Я использую opencv с opencvsharp.

При выполнении таблицы соответствия, а затем 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);
            }

Я нахожу только первое совпадение и знаю, что есть еще совпадения.

Ответы [ 2 ]

1 голос
/ 12 января 2015
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);
        }
0 голосов
/ 03 февраля 2012

Смотрите мой другой ответ здесь , где я показываю, как сделать именно то, что вы просите.Он написан на C ++, но портировать его на C # довольно просто.Вместо использования std::queue используйте .NET Queue .

По сути, вам нужно сканировать по вашему resImg, чтобы найти все максимальные (или минимальные в зависимости от алгоритма сравнения) указывает и записывает сколько угодно в какой-то контейнер (список, очередь, приоритетная очередь и т. д.).MinMaxLoc вернет только верхний матч, поэтому вы получаете только один матч.

...