| 
		
	
	
	
	
	   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  
 
        				  
  | 
 |