Здравствуйте, гость ( Вход | Регистрация )

> findimage в LUA
apaul
сообщение 25.1.2022, 14:46
Сообщение #1


**

Neophyte
Сообщений: 36
Регистрация: 19.8.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.051



Подскажите пожалуйста синтаксис findimage в LUA чтобы искать не с экрана, а в памяти, предварительно сохранив его getimage-ем. Шаблоны для поиска тоже находятся в памяти, загруженные через loadimage.
Заранее благодарен за помощь )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
sutra
сообщение 15.2.2022, 15:49
Сообщение #2


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Инфо для apaul
Код

    Всё-таки попробую дать рекомендации, которые на мой взгляд ускорят поиск и улучшат достоверность поиска.
    Итак, шрифт стандартный, плоский (не объёмный, без теней). Фон однородный, без переливов (не инверсионный).
Это позволяет для подавляющего большинства пикселей определить их принадлежность либо к фону, либо как
принадлежащих к каркасу символов, которые значительно ярче фона. Пиксели фона в представленном примере имеют
RGB=(116,67,43). Исходя из предположения, что всё это может очень сильно "плавать", будем считать фоновыми все
пиксели, канал BLUE которых находится в диапазоне от нуля, до 119. То есть "запас прочности" 76 единиц -
этого более чем достаточно. Соответственно пиксели, канал BLUE которых находится в диапазоне от 120 до 255,
будем считать принадлежащими символам, запасик тоже вроде есть (сориентируетесь сами где лучше делать запас).
    Начнём с шаблонов. Предлагаю для достоверности идентификации цифр использовать поиск и фоновых пикселей.
Поскольку задача состоит в создании универсальных шаблонов (для 3-х вариантов изображений) использование
фоновых пикселей сильно облегчит эту задачу. Например, цифра 3 может не так сильно отличаться от цифры 8,
если искать её используя только яркие пиксели каркаса символов. А вот если использовать в шаблоне и пиксели
фона, которые однозначно должны присутствовать у цифры 3 по левой границе изображения цифры, поиск даст
достоверный результат.
    Итак, в шаблоне цифры 3, по левой границе, можно смело добавить скажем 6 пикселей, которые на экране
поиска должны быть фоновыми. Закрасим эти пиксели скажем с RGB=(90,80,58), к ним мы применим параметры
{dev=5, acc=5} что даст пикселям фона огромный диапазон RGB от (0,0,0) до (181,161,119).
Каналы RED и GREEN нас не интересуют и запас по ним ещё больше, поскольку за основу принимаем канал BLUE.
Таким образом можно добавлять "тёмные" пиксели практически в шаблон любой цифры.

    Далее. На мой взгляд можно значительно сузить зону поиска, в первую очередь точно идентифицируя
верхнюю границу символов. Не забываем про мощный инструмент под названием FindColor. Одним её вызовом
мы убьём сразу 2-х зайцев. Определим верхнюю границу символов и определим количество разрядов чисел.
Приведу пример только для числа правее слэша, думаю принцип будет понятен.

    Далее код с комментами, надеюсь будет понятно, никаких смещений не будет.

--\/ Ищем на экране все пиксели, принадлежащие символам (координаты как в вашем примере - границы скрина)
local b,k = FindColor(x1, y1, x2, y2, {b=120,B=255,nP=-1})
if not (b) then  log("Что то пошло не так")  stop_script()  end  -- ничего не нашли
--\/ Верхняя граница символов равна ординате (1) ПЕРВОГО (с индексом нуль) найденного пикселя
--\/ Уверен на 99% , что всё будет работать корректно. Для удобства обзовём её yUp
local yUp=CI[0][0][1]
--\/ абсцисса нижнего пикселя слэша, он будет найден последним, она понадобится для вычисления количества разрядов.
local xS=CI[0][k][0]

--\/ Определяем количество разрядов числа правее слэша
--\/ Сначала ищем правую границу числа - очень приблизительное значение, но его будет достаточно
local xR=0      -- правая граница числа
for i=k-1,0,-1 do  -- цикл анализа найденных пикселей от конца к началу
--\/ если абцисса очередного найденного пикселя более чем на 20 пикселей отличается от абсциссы
--\/ слеша - найден пиксель принадлежащий самому правому символу цифры.
  if CI[0][i][0] - xS > 20 then  xR=CI[0][i][0]  break  end
end
--\/ количество разрядов округляем в большую сторону. 17 - это приблизительно ширина слэша + ширина пробела (5-6 пикселей)
--\/ 11.5 - (на вскидку) расчётная ширина символов цифр - колеблется 11 или 12
local raz = math.ceil((xR - xS - 17) / 11.5)

-- Осталось идентифицировать число. Естественно далее я проверить код не мог.
local number=0  -- значение идентифицируемого числа, пока = 0
local mng=1     -- значение множителя для текущего разряда (для младшего разряда, далее будет увеличиваться на порядок)
for i=1,raz do
  local digit=-1  -- значение очередной цифры (отрицательное значение - пока не определена)
  local xF1=math.floor (xS+17+(raz-i)*11.5 - 1)  -- минус 1 - допуск влево на 1 пиксель
  local xF2=xF1 + 5                              -- плюс 5 - допуск вправо
  local chk=0                                      -- количество найденных цифр (контроль корректности поиска)
  for j=0,9 do                                     -- цикл анализа 10 шаблонов цифр
    for x=xF1,xF2 do                                 -- цикл анализа 6-ти возможных позиций (с запасом)
      if FindImage(x,yUp,x+12,yUp+16,DIG[j]) then    -- 16 - высота цифр минус 1; 12 - условная ширина цифр
        chk=chk+1                                      -- цифра найдена - плюсуем количество найденных
        if chk>1 then                                  -- если нашли уже вторую цифру
          log("Атас! Нашли ДВЕ цифры: ",digit," и ", j)
          -- далее действия, например: сохранение зоны поиска в файл; инициализация ошибки и т.п.
        end
        digit=j
        break
      end
    end
  end
  if digit<0 then
    log("Кердык! Нихрена не нашли")
    -- далее действия, например: сохранение зоны поиска в файл для коррекции или создания нового шаблона
  end
  number=number+digit*mng
  mng=mng*10
end
log(number) -- значение числа.

Ковырял всё на сорую руку, мог и ошибиться - задача была показать логику поиска.
!!!!!!! Ваши шаблоны нужно увеличить по высоте на 2 пикселя, добавив например пустые строки пикселей сверху и снизу
Совсем забыл ... условие для формирования шаблонов нужно дополнить { {r=90,fgr=true,dev=5,acc=5}, {r=0,acc=80} }


Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
apaul   findimage в LUA   25.1.2022, 14:46
sutra   Нашёл где-то на задворках вариант использования фи...   26.1.2022, 13:34
apaul   Нашёл где-то на задворках вариант использования ф...   26.1.2022, 20:23
Madeus   Вот рабочий вариант поиска чисел   26.1.2022, 22:29
apaul   Вот рабочий вариант поиска чисел Может быть, но ...   26.1.2022, 23:26
apaul   Помогите, что-то никак не взлетает, и не пойму куд...   27.1.2022, 0:33
sutra   Я давно не работаю со стандартом, могу ошибаться. ...   27.1.2022, 11:11
sutra   По поводу буферов. Ну их размер и их количество Вы...   27.1.2022, 11:31
apaul   Буфер - он на то и буфер, он нужен только для заг...   27.1.2022, 14:57
sutra   Если честно, я не знаю как бы я обходился без свои...   27.1.2022, 11:49
sutra   Трафарет - это массив данных, определяемый Вашей п...   27.1.2022, 17:00
sutra   Грубо говоря, резюмируя. Создавайте сколько угодно...   27.1.2022, 17:22
apaul   Создавайте сколько угодно так называемых трафарет...   6.2.2022, 16:07
sutra   Вы первый, кто заинтересовался моей "кухней...   7.2.2022, 9:42
sutra   Скачал себе свой же файл. Да, я там прилично перед...   7.2.2022, 10:26
sutra   Вроде состряпал мало-мальски ответы на вопросы. Ну...   8.2.2022, 14:15
apaul   Вроде состряпал мало-мальски ответы на вопросы. Н...   8.2.2022, 15:51
sutra   Да не вопрос - спрашивай. Постараюсь ответить. Уда...   8.2.2022, 17:23
sutra   В качестве рекомендации. Иногда может казаться что...   9.2.2022, 10:37
apaul   Еще раз спасибо за модуль - впечатления сугубо пол...   11.2.2022, 13:06
sutra   Сорри, как обычно, чего в голову взбрело, то и пиш...   11.2.2022, 12:52
sutra   Начну с ключей для каналов. Ключи из строчных сим...   12.2.2022, 14:25
apaul   sutra, продолжаю эксперименты с Вашим модулем. С ч...   12.2.2022, 15:12
sutra   Что можно ещё добавить. Правильно подобрать отклон...   12.2.2022, 15:17
Cockney   Что можно ещё добавить. Правильно подобрать откло...   13.2.2022, 18:40
apaul   sutra, столкнулся с непонятным для меня поведение...   13.2.2022, 14:36
sutra   Конечно лучше бы взглянуть на код, прежде чем дава...   14.2.2022, 10:42
sutra   Я когда только начинал реализовывать идентификацию...   14.2.2022, 10:54
apaul   Дадите код - дам рекомендации. На мой взгляд с по...   14.2.2022, 12:41
sutra   ОК. Скачал, сейчас посмотрю что к чему. Я даже не ...   14.2.2022, 13:03
apaul   Сразу на вскидку. Глянул на шрифт. Уверяю 100% вс...   14.2.2022, 13:21
sutra   Всё верно виновник - это смещения. Вот сижу и смот...   14.2.2022, 13:50
sutra   Вроде с финдом всё нормально. Насколько я понял, т...   14.2.2022, 14:12
apaul   делает смещение поиска вниз и другие цифры уже не...   14.2.2022, 15:26
sutra   Ваш шрифт имеет абсолютно стандартное выравнивание...   14.2.2022, 14:27
sutra   Ну а конкретно в вашем частном случае, либо жестко...   14.2.2022, 14:37
sutra   Я понял. Я конечно не знаю всех нюансов что и где ...   14.2.2022, 16:52
apaul   Наверное Вам есть смысл сначала найти картинку си...   14.2.2022, 19:39
apaul   sutra , большое спасибо за рекомендации! Очень...   19.2.2022, 13:34
sutra   Рад, что смог помочь. И да, если фон однороден, то...   19.2.2022, 18:08


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 25.5.2024, 23:23
Designed by Nickostyle