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

> Считывание текста с картинок на экране, готовый скрипт
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 килобайт ) Кол-во скачиваний: 590


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
DarkMaster
сообщение 20.10.2015, 2:43
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.766
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 30010
Пользователь №: 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Отправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
Zeleax   Считывание текста с картинок на экране   23.2.2013, 23:35
zavas   Круто. По какому принципу ищет? И тройка с восьмёр...   23.2.2013, 23:57
Zeleax   Круто. По какому принципу ищет? И тройка с восьмё...   24.2.2013, 0:03
zavas   т.е. логика пока не изменилась?   24.2.2013, 0:14
Zeleax   т.е. логика пока не изменилась? Кроме того, появ...   24.2.2013, 11:44
Zeleax   Немного изменилась. Добавилась возможность использ...   24.2.2013, 0:25
xolost   Блиин.. я когда увидел сообщение про "3 и 8 к...   27.3.2013, 20:15
SEMA   Zeleax Подскажите пожалуйста, как можно сделать та...   1.4.2013, 14:26
Zeleax   С помощью скрипта читаем с экрана первое число в в...   1.4.2013, 19:06
Cos   Здравствуйте. Нужно обойти простенькую капчу, сост...   2.5.2015, 2:59
DarkMaster   По идее да, не находит вообще ни один символ? Что ...   2.5.2015, 11:11
THUNDER®   Всем привет! У меня вопрос возможно не в тему:...   9.5.2015, 12:59
DarkMaster   На 3 поста выше уже дана ссылка. Вероятнее всего в...   9.5.2015, 16:08
THUNDER®   На 3 поста выше уже дана ссылка. Вероятнее всего ...   10.5.2015, 1:52
Zeleax   Zeleax, а скрипт работал? Работал, конечно. Это ж ...   10.11.2015, 8:30
DarkMaster   Перед вызовом нет обнуления переменной: set #n 0   20.10.2015, 5:42


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

 

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