PorisulkiP

Untitled

Jun 17th, 2021
671
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2. * Здесь выполняется поиск по шаблону
  3. */
  4.  
  5. #include "search_by_template.h"
  6.  
  7. int main(int argc, char** argv)
  8. {
  9.     // Считываем изображение
  10.     Mat image = imread("C:/Users/alex1/source/repos/Practics/img.jpg");
  11.     //Mat image = imread("C:/Users/alex1/source/repos/Practics/img.png"); // норм пример
  12.     Mat result;
  13.  
  14.     // Создаём шаблон
  15.     Mat temp = imread("C:/Users/alex1/source/repos/Practics/tmp.jpg", 0);
  16.     //Mat temp = imread("C:/Users/alex1/source/repos/Practics/tmp.png", 0);
  17.  
  18.     // Делаем фотку чб
  19.     Mat image_gray;
  20.     cvtColor(image, image_gray, COLOR_BGR2GRAY);
  21.  
  22.     /** Метрика расхождений
  23.     * Ориг: https://habr.com/ru/company/joom/blog/445354/
  24.     * TM_SQDIFF — сумма квадратов разниц значений пикселей
  25.     * TM_SQDIFF_NORMED — сумма квадрат разниц цветов, отнормированная в диапазон 0..1.
  26.     * TM_CCORR — сумма поэлементных произведений шаблона и сегмента картинки
  27.     * TM_CCORR_NORMED — сумма поэлементных произведений, отнормированное в диапазон -1..1.
  28.     * TM_CCOEFF — кросс-коррелация изображений без среднего
  29.     * TM_CCOEFF_NORMED — кросс-корреляция между изображениями без среднего, отнормированная в -1..1 (корреляция Пирсона)
  30.     */
  31.     int match_method = TM_CCORR_NORMED;
  32.     double min_Val, max_Val;
  33.     Point min_Loc, max_Loc, matchLoc;
  34.  
  35.     // Проверка на неправильно введённое название файла
  36.     if (image.empty())
  37.     {
  38.         cout << "Could not open or find the image" << endl;
  39.         return -1;
  40.     }
  41.  
  42.     // Сопоставляем с шаблоном
  43.     matchTemplate(image_gray, temp, result, match_method);
  44.     minMaxLoc(result, &min_Val, &max_Val, &min_Loc, &max_Loc, Mat());
  45.  
  46.     // В зависимости от алгоритма, первой точкой могут являться разные ответы функции
  47.     if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
  48.         matchLoc = min_Loc;
  49.     else
  50.         matchLoc = max_Loc;
  51.  
  52.     // Рисуем прямоугольник
  53.     rectangle(image, matchLoc,
  54.               Point(matchLoc.x + temp.cols,
  55.                     matchLoc.y + temp.rows),
  56.               Scalar(255, 0, 0), 3, 8, 0);
  57.  
  58.  
  59.     // Выводим весь наш труд
  60.     show_window(image);
  61.  
  62.     return 0;
  63. }
  64.  
  65. void show_window(Mat image) {
  66.     String windowName = "Let's help Dora find a template"; // Установка имени окна
  67.  
  68.     namedWindow(windowName); // Создание окна
  69.  
  70.     imshow(windowName, image); // Грузим картинку в окно
  71.  
  72.     waitKey(0); // при нажатии на кнопку грохаем окно
  73.  
  74.     destroyWindow(windowName); // вот тут грохаем
  75. }
RAW Paste Data