|
findimage в LUA |
|
|
|
|
Ответов
sutra |
15.2.2022, 15:49
|
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} }
|
|
|
|
Сообщений в этой теме
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
|
|