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

> Считывание текста с картинок на экране, готовый скрипт
Zeleax
сообщение 23.2.2013, 23:35
Сообщение #1


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Задача: прочитать с экрана текст, который выглядит как картинка. Допустим, прочитать текст выражения примера (24+37=):
(IMG:http://cs315919.userapi.com/v315919099/5f72/YShC9g2Ipe8.jpg)

Решение:

1) сделать PrintScreen и сохранить его в файл bmp (24 бит), а затем нарезать и сохранить _каждый_ символ или цифру в отдельный файл картинки формата bmp (24 бит).
Для упрощения жизни: картинкам цифр дать имена типа 0.bmp, 1.bmp и т.д., буквам a.bmp, b.bmp и т.д., знакам - plus.bmp, minus.bmp и т.д. (т.е. знакам- произвольные имена).
а) Внимание! В каждом файле изображения левый верхний пиксель должен быть цветом фона! При поиске этот цвет будет считаться прозрачным и не будет проверяться! Учитывайте это нарезая символы.
б) чтобы при поиске скрипт не путал цифры 3 и 8, а также знаки - и + (находя их в одном и том же месте экрана, если они очень похожи по написанию и накладываются друг на друга при поиске) - закрасьте в Paint левый верхний пиксель этих картинок любым посторонним цветом. Это "превратит" обычный "прозрачный" фон картинки в проверяемый цвет и не даст спутать похожие символы. Если символы и так не путаются, то можно с этим не заморачиваться.

2) все картинки разместить в одной папке, в которой больше нет подпапок с картинками

3) в эту же папку записать текстовый файл links.txt, в котором будут храниться соответствия между именами файлов (без расширения) и символами(строками), которые буду подставляться в результат при нахождении данной картинки.
Файл links.txt состоит из набора строк, каждая из которых состоит из 2-х значений:
<имя файла без расширения> <символ табуляции> <текстовый символ>

Например:
minus -
plus +
morda :-)

Если в файле links.txt не записано соответствие для картинки из папки, но картинка была найдена на экране, то в результат будет подставляться имя файла картинки без расширения. Т.е. цифры и отдельные буквы в файл links.txt вносить необязательно.

4) в начале скрипта в переменной $imgDir указываем полный путь к папке с картинками, имя файла связей, координаты области поиска, в которой следует искать картинки:

set $imgDir d:\Img\ // папка с картинками (с обратным слешем в конце)
set $linkName links.txt // файл связей "имя файла" tab "текст символа"
init_arr %region(1 2) 380, 320 453, 332 // координаты X1 Y1 X2 Y2 области поиска
Перед запуском скрипта не забываем привязать скрипт к рабочему окну.

А вот сам скрипт и архив с примерами картинок (нарезано только несколько цифр):
Скрипт
Код

// Чтение изображений с экрана с преобразованием в текст v.1.0
// Zeleax, 2013 (c)
set linedelay 1
set logging clear
set logging mode noTime noScript noNumber
set delimiter ' ' // разделитель между элементами массива в логе

set $imgDir d:\Img\ // папка с картинками (с обратным слешем в конце)
set $linkName links.txt // файл связей "имя файла" tab "текст символа"
init_arr %region(1 2) 380, 320 453, 332   // координаты X1 Y1 X2 Y2 области поиска  

gosub parseRegion
msg Результат: $parseRegion

end_script


:parseRegion
set $ext .bmp // расширение файлов картинок
set $link $imgDir$linkName // полный путь к файлу линков

// получим список всех файлов bmp в каталоге
dir (%dir $imgDir *.bmp)
log В папке $imgDir найдено errorlevel картинок:
if errorlevel = 0
   alarm
   stop_script
end_if

// запишем в отдельный массив список файлов для проверки
set #sizeExt size($ext)
for #i 1 errorlevel
  set %img[#i 1] %dir[#i 4] // только имя файла
  set %img[#i 2] 99999 // порядковый номер для поиска
  set #sz size( %img[#i 1] ) - #sizeExt // длина имени файла без расширения
  set %img[#i 3] copy ( %img[#i 1] 1 #sz )
end_for

// проставим порядок файлов для проверки
load_array %link $link
set #linkSize size( %link )
log Загружено #linkSize строк связей

log Порядок проверки:
for #i 1 #linkSize
  if size ( %link[#i 2] ) > 0 // есть данные во 2 столбце строки
    set $fname %link[#i 1]$ext // нужное имя файла с расширением

    // ищем нужное имя в списке файлов папки
    set #n indexOf ( %img 1 ($fname))
    if #n > 0 // если есть файл - ставим ему порядковый номер поиска
      set %img[#n 2] #i // порядковый номер для поиска
      set %img[#n 3] %link[#i 2] // подставляем текст символа
    end_if
    log $fname - #i
  else
    break // прерываем нумерацию    
  end_if
end_for

set #imgSize size( %img ) // число файлов-картинок в папке
// сортируем имена файлов картинок по порядку поиска
for #i 1 #imgSize
   set #min %img[#i 2]
   set #imin #i
   set #ii #i + 1
   for #j #ii #imgSize
      if %img[#j 2] < #min
         set #min %img[#j 2]
         set #imin #j
      end_if  
   end_for
   // меняем местами минимальный элемент с текущим, используя промежуточную #z
   set #z %img[#i 2] // номер проверки
   set %img[#i 2] %img[#imin 2]
   set %img[#imin 2] #z  
   set $z %img[#i 1] // имя файла
   set %img[#i 1] %img[#imin 1]
   set %img[#imin 1] $z  
   set $z %img[#i 3] // текст символа
   set %img[#i 3] %img[#imin 3]
   set %img[#imin 3] $z  
end_for

// Ищем по порядку каждую картинку
set #x1 %region[1 1]
set #y1 %region[1 2]
set #x2 %region[2 1]
set #y2 %region[2 2]
log Ищем в области #x1 , #y1 - #x2 , #y2
log Результаты поиска картинок
set size ( %res ) // пустой массив для накопления результатов поиска
set #r 0 // счетчик номера найденного по порядку изображения
for #i 1 #imgSize
  set $fname $imgDir%img[#i 1]
  log Ищем: $fname
  set #a findimage (#x1 #y1 #x2 #y2 ( $fname ) %arr workwindow 90 )
  set #arrSize size(%arr)
  for #j 1 #arrSize
     set #r #r + 1
     set %res[#r 1] %img[#i 3] // сохраняем текст символа и координату X
     set %res[#r 2] %arr[#j 1]
     log %res[#r 1] : %res[#r 2]
  end_for
end_for
log Всего найдено #r символов

if #r > 1
  // Сортируем массив символов по порядку
  for #i 1 #r
     set #min %res[#i 2]
     set #imin #i
     set #ii #i + 1
     for #j #ii #r
        if %res[#j 2] < #min
           set #min %res[#j 2]
           set #imin #j
        end_if  
     end_for
     // меняем местами минимальный элемент с текущим, используя промежуточную #z
     set #z %res[#i 2] // координата X
     set %res[#i 2] %res[#imin 2]
     set %res[#imin 2] #z  
     set $z %res[#i 1] // текст символа
     set %res[#i 1] %res[#imin 1]
     set %res[#imin 1] $z  
  end_for

  // собираем массив в строку
  set $str ''
  for #i 1 #r
     set $str $str%res[#i 1]
  end_for
end_if

set $str trim ( $str ) // обрезаем пробелы
if size( $str ) > 0
  set $parseRegion $str
else
  set $parseRegion ''
end_if  
log Результат: $parseRegion
return


Сообщение отредактировал Zeleax - 24.2.2013, 16:52


Прикрепленные файлы
Прикрепленный файл  Img.zip ( 2,64 килобайт ) Кол-во скачиваний: 568


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов(1 - 16)
esqado
сообщение 23.2.2013, 23:57
Сообщение #2


*****

Journeyman
Сообщений: 357
Регистрация: 5.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.217



Круто. По какому принципу ищет? И тройка с восьмёркой больше не путаются...


--------------------
В обычном программировании: любое значение может быть преобразовано в тип string
В программировании Pilot: любое значение должно быть типа имейдж.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 24.2.2013, 0:03
Сообщение #3


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата(zavas @ 24.2.2013, 0:57) *

Круто. По какому принципу ищет? И тройка с восьмёркой больше не путаются...

По принципу перебора всех картинок в указанной папке. Причем первыми ищутся картинки, указанные в файле links.txt (в порядке перечисления).
Насчет не путать 3 и 8, а также - и +, то еще нужно будет доделать. На сегодня хватит )


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
esqado
сообщение 24.2.2013, 0:14
Сообщение #4


*****

Journeyman
Сообщений: 357
Регистрация: 5.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.217



т.е. логика пока не изменилась?


--------------------
В обычном программировании: любое значение может быть преобразовано в тип string
В программировании Pilot: любое значение должно быть типа имейдж.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 24.2.2013, 0:25
Сообщение #5


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Немного изменилась. Добавилась возможность использования любых символов, причем в заданном порядке проверки, что понадобится для решения проблемы 3<->8 (и ь<->ы).

З.Ы.: написал в посте со скриптом как обойти проблему 3/8 (+/-)

Сообщение отредактировал Zeleax - 24.2.2013, 10:09


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 24.2.2013, 11:44
Сообщение #6


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата(zavas @ 24.2.2013, 1:14) *

т.е. логика пока не изменилась?

Кроме того, появилась возможность считывания текста, даже используются различные начертания одного и того же символа.
Для этого нужно просто перечислить соответствия имен файлов картинок и подставляемые значения в файле links.txt


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
xolost
сообщение 27.3.2013, 20:15
Сообщение #7


******

Expert
Сообщений: 517
Регистрация: 17.6.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.035



Блиин.. я когда увидел сообщение про "3 и 8 как и всё остальное теперь решается", почти трясущимися руками искал код решения или описание..
и нашел только это:
Цитата
б) чтобы при поиске скрипт не путал цифры 3 и 8, а также знаки - и + (находя их в одном и том же месте экрана, если они очень похожи по написанию и накладываются друг на друга при поиске) - закрасьте в Paint левый верхний пиксель этих картинок любым посторонним цветом. Это "превратит" обычный "прозрачный" фон картинки в проверяемый цвет и не даст спутать похожие символы. Если символы и так не путаются, то можно с этим не заморачиваться.


Т.е. решение - использовать фон.
Да, я так и делал, пока не уперся в несколько проектов, где фон всегда динамичный....
хоть я уже и эту проблему решил - описывал где-то в сценарии поиска чисел от Заваса, но мне так дико было любопытно ещё какое-либо решение увидеть..
ну, все равно спасибо. пока Твой скрип не использовал - не было нуждны, но обязательно опробую со временем.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
SEMA
сообщение 1.4.2013, 14:26
Сообщение #8


***

Novice
Сообщений: 72
Регистрация: 10.2.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 14.624



Zeleax Подскажите пожалуйста, как можно сделать такую штуку,
Данным скриптом находит ряд цифр - запоминает их,
потом находит в другом месте
и после сравнивает первые и вторые цифры, реально ли это организовать? и если реально подскажите пожалуйста
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 1.4.2013, 19:06
Сообщение #9


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



С помощью скрипта читаем с экрана первое число в виде строки текста, затем так же- второе число в другую строку.
Потом в скрипте сравниваем обе строки.

Читать с экрана можно разными вариантами:
https://forum.uokit.com/index.php?s=&sh...st&p=186938

Если вы никогда раньше скрипты не писали, то начните отсюда:
http://goo.gl/8LC1p


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cos
сообщение 2.5.2015, 2:59
Сообщение #10


*

Registred
Сообщений: 1
Регистрация: 2.5.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.449
Возраст: 20



Здравствуйте. Нужно обойти простенькую капчу, состоящую из цифр. Этот способ идеально подходит, только вот возникла проблема: скрипт не находит символы (IMG:style_emoticons/default/sad.gif) Наверное, это я что-то не так делаю, подкорректируйте меня, пожалуйста (:
Насколько я понял, нужно всего лишь сделать скриншоты отдельных цифр и заполнить это:
Код

set $imgDir d:\Img\ // папка с картинками (с обратным слешем в конце)
set $linkName links.txt // файл связей "имя файла" tab "текст символа"
init_arr %region(1 2) 380, 320 453, 332   // координаты X1 Y1 X2 Y2 области поиска  
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.5.2015, 11:11
Сообщение #11


***********

Модератор UOPilot
Сообщений: 9.764
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29953
Пользователь №: 11.279



По идее да, не находит вообще ни один символ?
Что именно не распознает?
Изображения сохранены в 24 бита бмп?
Привязка к окну сделана?
Окно в котом происходит поиск на переднем плане?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
THUNDER®
сообщение 9.5.2015, 12:59
Сообщение #12


*

Registred
Сообщений: 7
Регистрация: 9.5.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.461



Всем привет! У меня вопрос возможно не в тему: есть ли программа, которая распознает текст а лучше цифры в нужном окне, корректно работающая с данным кликером? Данный метод не очень мне подходит, т.к. фон не одноцветный и цифры меняются. По этому поймать нужную с нужным фоном не представляется возможным.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.5.2015, 16:08
Сообщение #13


***********

Модератор UOPilot
Сообщений: 9.764
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29953
Пользователь №: 11.279



На 3 поста выше уже дана ссылка. Вероятнее всего вам либо в сторону тессеракта стоит копать https://forum.uokit.com/index.php?showtopic=25759 либо антигейта https://forum.uokit.com/index.php?showtopic=28193 под капчи.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
THUNDER®
сообщение 10.5.2015, 1:52
Сообщение #14


*

Registred
Сообщений: 7
Регистрация: 9.5.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.461



Цитата(DarkMaster @ 9.5.2015, 17:08) *

На 3 поста выше уже дана ссылка. Вероятнее всего вам либо в сторону тессеракта стоит копать https://forum.uokit.com/index.php?showtopic=25759 либо антигейта https://forum.uokit.com/index.php?showtopic=28193 под капчи.


Благодарю! (IMG:style_emoticons/default/thanks.gif) Буду копать) Главное что направление теперь имеется))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 20.10.2015, 2:43
Сообщение #15


***********

Модератор UOPilot
Сообщений: 9.764
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29953
Пользователь №: 11.279



Zeleax, а скрипт работал?
Цитата
set %img[#i 1] %dir[#i 4] // только имя файла

уже косяк. 4 размерность содержит не имя, а расширение.
Так же из обнаруженного мной:
Цитата
set #sz size( %img[#i 1] ) - #sizeExt // длина имени файла без расширения
set %img[#i 3] copy ( %img[#i 1] 1 #sz )

Видимо почему-то предполагалось, что в 1 элементе мы имеем не просто имя файла, а имя и расширения и почему-то отсекалось. В итоге при коротких именах имеем копирование отрицательного количества элементов. Тупо сделал копирование 1 элемента в 3.
Цитата
if #r > 1
// Сортируем массив символов по порядку

Не учитывает вариант, когда был найден только один символ.

После правки вышеперечисленного скрипт шуршит, но файл линков не подхватывает, правда оно мне не особо нужно, но все равно проблемы остались.

Сообщение отредактировал DarkMaster - 20.10.2015, 2:44


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 20.10.2015, 5:42
Сообщение #16


***********

Модератор UOPilot
Сообщений: 9.764
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29953
Пользователь №: 11.279



Цитата
log Порядок проверки:
for #i 1 #linkSize

Перед вызовом нет обнуления переменной:
set #n 0


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 10.11.2015, 8:30
Сообщение #17


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата(DarkMaster @ 20.10.2015, 2:43) *
Zeleax, а скрипт работал?

Работал, конечно. Это ж не две строчки на коленке написать и выложить )


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

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

 

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