На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Дорогие друзья!
Поздравляем вас с Новым 2022 годом!
Всем ЗДОРОВЬЯ, удачи, успеха и благополучия!

msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Определение количества фрагментов на изображении
    Мне нужно подсчитать количество фрагментов на изображении. Приложение должно быть десктопное, без использования интернета. Шаблон фрагмента - это элемент изображения, полученный из этого же изображения путем выделения нужного фрагмента и его сохранения. Фрагменты на изображении не перекрываются. В интернете много информации по обработке изображений с помощью ИИ, а есть более простые способы решения этой задачи? К сожалению, раньше обработкой изображений не занимался. Пока научился на C# загружать изображения, перемещаться по пикселам. Помогите, пожалуйста, ссылками на учебники и ресурсы, которые помогли бы мне решить эту задачу.
      Цитата tumanovalex @
      Фрагменты на изображении не перекрываются.

      А какой был фон ДО нанесения на него фрагментов? Тут три варианта:
      №1. Однотонный фон. Тогда достаточно посчитать отдельные фрагменты, контрастные с фоном, ведь "Фрагменты на изображении не перекрываются".
      №2. Фон - заранее известная картинка. Тогда достаточно вычесть из результата эту картинку, и получим №1.
      №3. Фон случайный и заранее неизвестен - тогда задача нерешаема, ведь фон заранее может содержать участки, похожие на искомое изображение.
        Я плохо рассказал о задаче. Фона, на который накладываются картинки, нет. Есть просто картинка (jpg), на которой есть одинаковые элементы. Эти элементы повторяются по горизонтали (несколько рядов элементов на изображении), между ними есть небольшие расстояния по вертикали и горизонтали (поэтому и указал, что они не пересекаются). В качестве шаблона для подсчета можно в графическом редакторе вырезать один из элементов на изображении, сохранить и использовать его для подсчета. В качестве примера прикрепил картинку типа "шахматная доска", на которой нужно определить, например, количество черных квадратов, белых квадратов, пар "белый и черный квадрат". Изображение может быть цветным или черно-белым. На реальной картинке элементы более сложные.Я где-то читал, что нужно вычислить корреляционную функцию между изображением и его шаблоном. Если эта функция имеет наибольшее значение, то значит участок изображения очень похож на шаблон. Как я понимаю, нужно по изображению "перемещать" шаблон и вычислять корреляционную функцию между участком изображения и шаблона. Вот только не помню, как нужно было вычислять эту функцию. Есть, наверное, и другие способы.
        Прикреплённая картинка
        Прикреплённая картинка
          Цитата tumanovalex @
          Фона, на который накладываются картинки, нет. Есть просто картинка (jpg), на которой есть одинаковые элементы.

          А между этими элементами что? Фона не может не быть, JPG - это прямоугольное изображение, если между фрагментами есть расстояние, значит есть пиксели с каким-то содержимым. Вопрос - с каким. Ответ "с каким угодно" не годится, ведь может оказаться рисунок, в точности соответствующий исходному фрагменту, тогда мы его не отличим.
          Так что, если нужно решение - нужна более строгая формулировка условия задачи.
          А если нужно определение корреляционной функции, так его нет в общем виде - мы сами определяем условия соответствия одного изображения другому.
            M
            Тема отображена в разделе(ах): Алгоритмы
            Сообщение на автоудалении
              Цитата tumanovalex @
              В интернете много информации по обработке изображений с помощью ИИ, а есть более простые способы решения этой задачи? К сожалению, раньше обработкой изображений не занимался

              Заплатят больше за решение с помощью ИИ.
                Посмотрите на странице https://ru.stackoverflow.com/questions/8123...и/812762#812762, там есть пример и обсуждение темы поиска по шаблону
                  Спасибо за ссылку. Обязательно посмотрю. По ссылке https://docs.opencv.org/4.x/d4/dc6/tutorial...e_matching.html есть пример Template Matching with Multiple Objects на Питоне:
                  ExpandedWrap disabled
                    import cv2 as cv
                    import numpy as np
                    from matplotlib import pyplot as plt
                    img_rgb = cv.imread('mario.png')
                    img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
                    template = cv.imread('mario_coin.png',0)
                    w, h = template.shape[::-1] // Получение формы изображения-шаблона и определение размеров формы шаблона по горизонтали и вертикали?
                    res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED) // получение результата сравнения с шаблоном-одно изображение?
                    threshold = 0.8
                    loc = np.where( res >= threshold) // сравнение с порогом
                    for pt in zip(*loc[::-1])// откуда появляется массив?
                        cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) // выделение красным каждого найденного объекта?
                    cv.imwrite('res.png',img_rgb)
                  К сожалению, с Питоном не знаком. Хотел бы перевести код на С++. По функциям OpenCV вопросов нет. Непонятные мне вещи указал в комментариях к коду. Может быть кто-нибудь поможет перевести код на С++?
                    tumanovalex
                    Питон несёт с собой фуеву тучу библиотек, за что очень любим говнокодерами. Предлагаете всё переписать на С? Это большая коммерческая работа.
                      Нашелся добрый человек, который сделал код на C++ (https://www.cyberforum.ru/graphics-dev/thread2907053.html). Я попытался переделать его для определения количества найденных по шаблону SquareBlackColor.jpg фрагментов в изображении pattern.jpg (изображения есть в прикрепленном проекте)
                      ExpandedWrap disabled
                        #include <iostream>
                        #include <opencv2/highgui.hpp>
                        #include <opencv2/imgcodecs.hpp>
                        #include <opencv2/imgproc.hpp>
                         
                        void DisplayMessage(std::string sMes)
                        {
                          std::cout << sMes << std::endl;
                          system("pause");
                          exit(EXIT_SUCCESS);
                        }
                         
                        int main(int argc, char** argv)
                        {
                          if (argv[1] == NULL)
                            DisplayMessage("Original image missing!");
                          if (argv[2] == NULL)
                            DisplayMessage("Template image missing!");
                          if (argc > 3)
                            DisplayMessage("There should be two parameters in the command line!");
                          cv::Mat imgorig  = imread(argv[1], cv::IMREAD_UNCHANGED);
                          cv::Mat imgtempl = imread(argv[2], cv::IMREAD_UNCHANGED);
                          cv::Mat result = cv::Mat(imgorig.rows - imgtempl.rows + 1, imgorig.cols - imgtempl.cols + 1, CV_32FC1);
                          cv::matchTemplate(imgorig, imgtempl, result, cv::TM_CCOEFF_NORMED);
                          cv::namedWindow("Result", cv::WINDOW_NORMAL);
                          cv::imshow("Result", result);
                          cv::imwrite("Result.jpg", result);
                          auto first = result.begin<float>();
                          auto last = result.end<float>();
                          cv::waitKey(0);
                          int i = 0;
                          for (; first != last; ++first)
                          {
                           if (*first > 0.9f)
                            {
                              i++;
                            }
                          }
                        }
                      , но ничего не получилось, в цикле в ветку if нет заходов. Хотя по полученному в результате работы matchTemplate изображению видно, что фрагменты были найдены. Может кто-нибудь подскажет, как подсчитать количество найденных фрагментов.
                      Прикреплённый файлПрикреплённый файлCppOpenCVstudy.zip (19,48 Кбайт, скачиваний: 12)
                      Сообщение отредактировано: tumanovalex -
                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0372 ]   [ 20 queries used ]   [ Generated: 19.01.22, 22:06 GMT ]