Author Topic: Сравнение двух изображений  (Read 5272 times)

0 Members and 1 Guest are viewing this topic.

dubkonst

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Сравнение двух изображений
« on: September 15, 2016, 02:11:27 PM »
Здравствуйте!
Подскажите пожалуйста как сравнить небольшой кусок экрана примерно 50х50 с файлом шаблонов который больше по размеру. Конструкция нарезок отдельных шаблонов не хочу применять, потому как очень сильно утяжелит работу скрипта и необходимостью постоянного редактирования.
Заранее спасибо.

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: Сравнение двух изображений
« Reply #1 on: September 15, 2016, 02:31:20 PM »
возможности найти фрагмент образца во фрагменте экрана нет
не могу представить ситуацию, в которой нельзя сделать 100 файлов-образцов вместо одного, содержащего все

dubkonst

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Сравнение двух изображений
« Reply #2 on: September 15, 2016, 11:55:55 PM »
возможности найти фрагмент образца во фрагменте экрана нет
не могу представить ситуацию, в которой нельзя сделать 100 файлов-образцов вместо одного, содержащего все
Все очень просто. Можно и сделать 100 и 1000 одинарных шаблонов и смотреть весь экран.
Причины по которым я не хочу идти по этому пути:
1. Постоянно появляются новые изображения, что ведет к постоянному увеличению и усложнению восприятия кода скрипта. Сравнение внутри сравнения и постоянно увеличивающийся. Программа должна быть лаконичной.
2. Постоянное увеличение файлов-шаблонов. Забивание хламом так сказать.
3. В случае необходимости отладки скрипта это сильно затруднит работу.
4. Личный мой способ решения задачи.

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: Сравнение двух изображений
« Reply #3 on: September 16, 2016, 12:17:12 AM »
1. Постоянно появляются новые изображения, что ведет к постоянному увеличению и усложнению восприятия кода скрипта. Сравнение внутри сравнения и постоянно увеличивающийся. Программа должна быть лаконичной.
2. Постоянное увеличение файлов-шаблонов. Забивание хламом так сказать.
3. В случае необходимости отладки скрипта это сильно затруднит работу.
4. Личный мой способ решения задачи.
1 - если логика скрипта меняется для каждого нового искомого фрагмента, то код скрипта и так усложнится.
а если логика едина, называйте файлы-шаблоны, используя цифровой индекс в имени <sample000001.bmp>, и в скрипте формируйте имя, используя счётчик цикла
НО! Вы так и не сформулировали саму Задачу.
2 - ну да, файлов будет не один, а много, и что? возможно, мы не представляем себе объём Задачи (см. п. 1)
3 - не согласен (см. п.1)
4 - ну с этим не поспоришь

dubkonst

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Сравнение двух изображений
« Reply #4 on: September 16, 2016, 12:42:52 AM »
Опишите подробней вашу нестандартную задачу, пока всё выглядит как ваша лень и неумение мыслить логически.
Новички порой ищут, тернистые обходные пути, там где давно проложены магистрали из готовых шаблонов. ;D
Доля правды есть. Действительно и лень немного было и не было особой возможности искать (времени).
Программирую достаточно долго и с логикой дружу, как мне кажется. Кстати много лет назад пришел к выводу, что именно лень дает самый рациональный путь решения задачи, особенно в программировании.
В функции if_picture_in ищем маленький рисунок в большом getscreen. Суть вопроса сведу к паре задач:
1. Записать определенный фрагмент экрана в файл (сделать маленький шаблон для поиска).
2. Прочитать файл шаблонов в буфер (гетскрин, но из файла).
3. найти старым добрым способом.
То есть хочу поменять местами.
3-й пункт знаю как делать, 1-й нашел, остался 2-й...
Мои доводы для такого поиска привел в предыдущем комментарии.
Могу добавить, что при получении нового изображения нужно только править рисунок шаблонов. При сервисе обновления для многих пользователей скрипа это огромный плюс, не надо перезакачивать весь пакет.

И еще сейчас по ходу дела пришла мысль, что может такой способ очень сильно сократить время поиска совпадений. Утверждать не буду, но по логике:
1. фрагмент экрана шириной 50 пипок.
2. ширина шаблона тоже 50.
3. по логике если не совпадают первые пикселы в строке, то и совпаления не может быть в этой строке, то есть 49 по горизонтали смотреть не надо, а можно смело переходить к следующей строчке.
Может это как вариант для создания новой дополнительной функции для работы с изображениями. Было бы не плохо с возможностью шага по вертикали. Но это так рассуждения вслух.

dubkonst

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Сравнение двух изображений
« Reply #5 on: September 16, 2016, 12:45:19 AM »
1. Постоянно появляются новые изображения, что ведет к постоянному увеличению и усложнению восприятия кода скрипта. Сравнение внутри сравнения и постоянно увеличивающийся. Программа должна быть лаконичной.
2. Постоянное увеличение файлов-шаблонов. Забивание хламом так сказать.
3. В случае необходимости отладки скрипта это сильно затруднит работу.
4. Личный мой способ решения задачи.
1 - если логика скрипта меняется для каждого нового искомого фрагмента, то код скрипта и так усложнится.
а если логика едина, называйте файлы-шаблоны, используя цифровой индекс в имени <sample000001.bmp>, и в скрипте формируйте имя, используя счётчик цикла
НО! Вы так и не сформулировали саму Задачу.
2 - ну да, файлов будет не один, а много, и что? возможно, мы не представляем себе объём Задачи (см. п. 1)
3 - не согласен (см. п.1)
4 - ну с этим не поспоришь
через цикл не делал в имени файла, надо будет разбираться как именно это сделать. На ум пришел такой вариант решения.
Можно увидеть пример через цикл в имени? Буду благодарен.
« Last Edit: September 16, 2016, 12:58:05 AM by dubkonst »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Сравнение двух изображений
« Reply #6 on: September 16, 2016, 09:19:35 AM »
3-й пункт знаю как делать, 1-й нашел, остался 2-й...
Второго нет. Нет такого функционала.

Можно увидеть пример через цикл в имени? Буду благодарен.
Code: (clickermann) [Select]
GETSCREEN
FOR($num=1, $num < 11)
    IF_PICTURE_IN(0,0,$_xmax,$_ymax, STRCONCAT("image_", $num, ".bmp"))
// если нужно прерываем цикл  и другие не ищем
$num = 1000
   
        // ...  действия
        WAITMS(100)
    END_IF
END_CYC

Ищет одну из заготовок:
image_1.bmp
image_2.bmp
...
image_10.bmp


И еще сейчас по ходу дела пришла мысль, что может такой способ очень сильно сократить время поиска совпадений. Утверждать не буду, но по логике:
1. фрагмент экрана шириной 50 пипок.
2. ширина шаблона тоже 50.
3. по логике если не совпадают первые пикселы в строке, то и совпаления не может быть в этой строке, то есть 49 по горизонтали смотреть не надо, а можно смело переходить к следующей строчке.
Может это как вариант для создания новой дополнительной функции для работы с изображениями. Было бы не плохо с возможностью шага по вертикали. Но это так рассуждения вслух.
Все оптимизации встроены в функцию поиска. Иначе бы оно искало намного дольше.

Но твоя идея понятна. Другой вопрос, точно ли там будет несколько сотен образцов? И даже если ввести такой функционал, твоё решение слишком узкоспециализированное. Оно подходит только для определения "есть ли указанное изображение на экране (область) среди заданных и прописанных фрагментов".  Но узнать какой именно это фрагмент (чтоб сделать разные действия) уже намного сложнее и функционал нужно расширять. А задавать входные данные тоже будет морока. Всё будет более мение просто если все образцы одного размера. На практике так бывает редко.
« Last Edit: September 16, 2016, 12:03:58 PM by Vint »


dubkonst

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Сравнение двух изображений
« Reply #7 on: September 16, 2016, 09:38:49 AM »
kiril, спасибо за помощь. Ну может и действительно баян, я так просто подумалось...
только вот STRCONCAT("image_.bmp", $num, ".bmp")
может STRCONCAT("image_", $num, ".bmp")
« Last Edit: September 16, 2016, 10:24:52 AM by dubkonst »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Сравнение двух изображений
« Reply #8 on: September 16, 2016, 09:46:02 AM »
Вот-вот.
Плюсы:
1. ускорение будет минимальное, за счёт выноса самого вызова функции из цикла, по сравнению с тем методом который уже есть.
Не поиск, а сам вызов функции (на это тоже тратятся ресурсы). Но выгода мизерная.
На 20-30 картинках и не заметишь. Будет 300? 500? 2000? Что-то у меня сомнения.
2. больше не вижу.

Минусы:
1. Простыню из образцов нужно готовить, склеивая в редакторе отдельные заготовки. Кто это будет делать? Может только ты и только один раз, на второй терпения не хватит ИМХО. Гораздо проще в папку скинуть пачку мелких заготовок. Любую из них выкинуть  или изменить не составит труда, как и добавление.
2. Если нужно будет вычислять какая именно картинка сработала, мы сразу ограничиваемся размерами. Один из размеров (ширина/высота) должны быть у всех заготовок одинаковые.
3. Нужно вводить доп функционал в кликермэн. Добавлять в справку. Это наверно и не минус, но на это нужно время выделить.

Может я каких доводов не додумал? Дополняй.


dubkonst

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Сравнение двух изображений
« Reply #9 on: September 16, 2016, 10:31:06 AM »
Vint, я думаю может и нет смысла дальше развивать это направление, тем более нет варианта запихивание рисунка из файла в буфер...
Я вот всё думал может можно скинуть рисунки в папку img например, а в скрипте
 if_piture_in .... img\sample_1.bmp ...?

dubkonst

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Сравнение двух изображений
« Reply #10 on: September 16, 2016, 10:40:42 AM »
Автор темы патологически боится " Забивание хламом так сказать", поэтому после сравнения  "небольшой кусок экрана примерно 50х50", можно удалять.  :o
Ещё, он же проповедует нам "...Программа должна быть лаконичной", черта с два,
программа должна быть:
 РАБОТОСПОСОБНОЙ,
 УДОБНОЙ В ИСПОЛЬЗОВАНИИ,
 УСТОЙЧИВОЙ К СБОЯМ,
Жертвовать этими характеристиками, в угоду лаконичности - бред! >:(
Выдохни... не надо так нервничать...
Да мне не нравится куча файлов, это проблема?
Тебя никто не расстреляет если программу напишешь РАБОТОСПОСОБНОЙ,  УДОБНОЙ В ИСПОЛЬЗОВАНИИ,  УСТОЙЧИВОЙ К СБОЯМ и при этом она будет лаконичной. Это не несовместимые критерии, мне жаль если у тебя так не получается.
С функцией "склеивания" имени файла действительно помог, за что тебя еще раз благодарю.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Сравнение двух изображений
« Reply #11 on: September 16, 2016, 12:05:50 PM »
только вот STRCONCAT("image_.bmp", $num, ".bmp")
может STRCONCAT("image_", $num, ".bmp")
Да, опечатался. В кликере исправил, а на форум пошло старое.

Vint, я думаю может и нет смысла дальше развивать это направление, тем более нет варианта запихивание рисунка из файла в буфер...
Я вот всё думал может можно скинуть рисунки в папку img например, а в скрипте
 if_piture_in .... img\sample_1.bmp ...?
Не можно, а нужно. Не валить же всё в одну кучу.


dubkonst

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Сравнение двух изображений
« Reply #12 on: September 16, 2016, 01:48:04 PM »
С функцией "склеивания" имени файла действительно помог, за что тебя еще раз благодарю.
мог помочь, но не захотел нервничать, так что переадресую благодарности, тем кто их заслужил.  :P
Ну да легче и прикольней изобличить проповедника неверного чем что-то путёвое сказать ;)