Шаблон OpenCV. Результат совпадения черный

Я получил следующий код для поиска шаблона в исходном изображении:

private void button1_Click(object sender, EventArgs e)
    {
        toggleStatus();
        using (Mat template = CvInvoke.Imread("C:\\Users\\Hendr\\Desktop\\temp.png", Emgu.CV.CvEnum.ImreadModes.Grayscale))
        using (Mat source = CvInvoke.Imread("C:\\Users\\Hendr\\Desktop\\yVLsd.png", Emgu.CV.CvEnum.ImreadModes.Grayscale))
        {
            log("Image loaded into memory...");
         //   pictureBox1.Image = template.Bitmap;
            pictureBox1.Image = source.Bitmap;

            var width = source.Width - template.Width + 1;
            var height = source.Height - template.Height + 1;
            // Mat result = new Mat((new System.Drawing.Size(width,height), Emgu.CV.CvEnum.IplDepth.IplDepth32F, 1);
            Mat result = new Mat(width, height, DepthType.Cv8U, 1);

            CvInvoke.MatchTemplate(source, template, result ,Emgu.CV.CvEnum.TemplateMatchingType.SqdiffNormed);
            var THRESHOLD = 0.0;

            double minVal = 0, maxVal = 0;
            System.Drawing.Point minLoc = new Point(), maxLoc = new Point();
            CvInvoke.MinMaxLoc(result, ref minVal, ref maxVal, ref minLoc, ref maxLoc);
            Rectangle rect = new Rectangle(minLoc.X,minLoc.Y, width,height);
            var outlineColor = (minVal > THRESHOLD) ?Color.Green : Color.Red;
            CvInvoke.Rectangle(result, rect, new MCvScalar(0,0,0));

            log(rect.Location.ToString());
            pictureBox1.Image = result.Bitmap;
        }
        foreach (object itemChecked in checkedListBox1.CheckedItems)
        {
            // Use the IndexOf method to get the index of an item.
            MessageBox.Show("Item with title: \"" + itemChecked.ToString() +
                            "\", is checked. Checked state is: " +
                            checkedListBox1.GetItemCheckState(checkedListBox1.Items.IndexOf(itemChecked)).ToString() + ".");
        }
    }

Исходное изображение выглядит так: введите здесь описание изображения

и соответствующий шаблон: введите здесь описание изображения

Однако мой результат затемнен:

введите здесь описание изображения

Я убедился, что template и source Mat правильно загружаются в память. См. pictureBox1.Image = source.Bitmap; ....

В итоге не могу найти в доке никакой информации, почему мой result мат(pictureBox1.Image = result.Bitmap;) черный. Кто-нибудь еще имеет/имела эту проблему и может дать мне ссылку или быстрое исправление?


person 0x45    schedule 05.07.2018    source источник
comment
Что, если умножить изображение совпадения на 255? Результатом matchTemplate является одноканальное изображение с плавающей запятой со значениями от 0 до 1. Не обычный диапазон [0, 255] для 8-битных изображений.   -  person Sunreef    schedule 05.07.2018
comment
@Sunreef умножить изображение матча - что именно вы имеете в виду?   -  person 0x45    schedule 05.07.2018
comment
Умножьте значения, хранящиеся в результате Mat, на 255. Хотя я никогда не использовал EmguCV, поэтому не знаю, поможет ли это.   -  person Sunreef    schedule 05.07.2018
comment
Проверьте результирующую матрицу, если она черная, значит, есть проблема с реализацией функции matchTemplate.   -  person Nikita Chopra    schedule 05.07.2018
comment
Я не мог это исправить, однако сейчас я делаю это с помощью cpp...   -  person 0x45    schedule 07.07.2018


Ответы (2)


У меня была такая же проблема при запуске того же примера для Java. Я решил это, используя тип данных CV_32FC1. Для вашего кода С# я думаю, что это должно быть:

Mat result = new Mat(width, height, DepthType.Cv32F, 1);

Для полного объяснения одного и того же примера сопоставления шаблонов в С++, Java и Python, пожалуйста, проверьте:

https://docs.opencv.org/3.4/de/da9/tutorial_template_matching.html

person Sameh Yassin    schedule 04.11.2018

Убедитесь, что результат находится в диапазоне [0,255] путем нормализации следующим образом:

normalize( result, result, 0, 255, NORM_MINMAX, CV_8UC1); 

как- использовать-cv2-imshow-правильно-для-поплавка

person corticalhazard    schedule 08.10.2020