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

> Считывание текста с картинок на экране, готовый скрипт
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Отправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
THUNDER®
сообщение 9.5.2015, 12:59
Сообщение #2


*

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



Всем привет! У меня вопрос возможно не в тему: есть ли программа, которая распознает текст а лучше цифры в нужном окне, корректно работающая с данным кликером? Данный метод не очень мне подходит, т.к. фон не одноцветный и цифры меняются. По этому поймать нужную с нужным фоном не представляется возможным.
Пользователь в офлайне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
DarkMaster   На 3 поста выше уже дана ссылка. Вероятнее всего в...   9.5.2015, 16:08
THUNDER®   На 3 поста выше уже дана ссылка. Вероятнее всего ...   10.5.2015, 1:52
DarkMaster   Zeleax, а скрипт работал? уже косяк. 4 размерност...   20.10.2015, 2:43
Zeleax   Zeleax, а скрипт работал? Работал, конечно. Это ж ...   10.11.2015, 8:30
DarkMaster   Перед вызовом нет обнуления переменной: set #n 0   20.10.2015, 5:42


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

 

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