PrintScreen + Распознавание текста

askkas
Дата: 06.02.2013 15:57:49
Добрый день. Существует задача:
1) Сделать скриншот окна приложения.
2) Выбрать из скриншота некоторую область (x1,y1,x2,y2)
3) Для лучшего распознавания Инвертировать цвета области (Белый текст на черном фоне)
4) Распознать текст в рисунке и скопировать его в буфер обмена для последующей работы.

4 Пункт сделан при помощи MODI, т.к. FineReader Engine можно заказать будучи только юридическим лицом, а Tesseract и cuneiForm вообще половину букв не понимают.

Пример готового 4-го пункта на MODI прикладываю. Но как быть с остальными пунктами? В GDI не нашел инвертирования цветов.
 SET TALK OFF   
  SET SAFETY OFF   
  inputFile = "D:\1inv.jpg"  
  strRecText=""  
  Doc1 = CREATEOBJECT('MODI.Document')  
  Doc1.Create(inputFile)  
  Doc1.OCR()  && распознавание всех страниц, если файл многостраничный  
  For imageCounter = 0 To (Doc1.Images.Count - 1) && срабатывает на кождой странице  
      strRecText = ALLTRIM(strRecText)+Doc1.Images(imageCounter).Layout.Text    && помещение результатов работы в строку  
  ENDFOR   
  strtofile(strRecText,"d:\2.txt")     && сохранение распознанного файла на диск  
  Doc1.Close() && очистка  
  
Dima T
Дата: 06.02.2013 16:19:52
Тут пример как скриншот сделать.
Для вырезания/инвертирования можно какой-нибудь графический софт использовать. Например www.imagemagick.org работает из командной строки.
Про GDI ничего не скажу, не пробовал.

Может есть другие пути решения задачи? Прога своя или чужая?
askkas
Дата: 06.02.2013 16:28:30
Dima T,
1) В примере как сделать скриншот - очень низкое разрешение экрана получается, намного ниже, чем есть в действительности.
2) Также неизвестно как вырезать некоторую область экрана.
Jonny540
Дата: 06.02.2013 17:04:22
askkas
Добрый день. Существует задача:
1) Сделать скриншот окна приложения.
2) Выбрать из скриншота некоторую область (x1,y1,x2,y2)
3) Для лучшего распознавания Инвертировать цвета области (Белый текст на черном фоне)
4) Распознать текст в рисунке и скопировать его в буфер обмена для последующей работы.
Что-то эта задачка больно напоминает нечто шпионское... Приложение небось не фоксовое ?
askkas
Дата: 06.02.2013 17:07:47
Jonny540,
Приложение на фоксе. Просто есть скомпилированное ПО, и для автоматизации моя программа должна знать на какую кнопку ей нажать. А это, как известно, можно сделать только в зависимости от того, какие кнопки сейчас видны на экране.
Dima T
Дата: 06.02.2013 17:16:56
1. Поизучал внимательнее. В том примере только как сохранить из буфера обмена. Тут все вместе. Попробовал. У меня разрешение совпало с разрешением монитора.
2. Как вариант закрасить ненужное белым. Для распознавания подойдет. Поизучай GDI. Закрасить там точно есть.
askkas
Дата: 06.02.2013 17:22:23
Dima T,
Во вложении программный скриншот и рядом - скриншот Windows.
Разница в качестве картинки налицо. Ридер ее может уже не распознать
Dima T
Дата: 06.02.2013 17:42:00
Открой в паинте. Виндовый просмотрщик ужимает картинку. Отсюда искажения.
Dima T
Дата: 06.02.2013 18:33:54
askkas
Jonny540,
Приложение на фоксе. Просто есть скомпилированное ПО, и для автоматизации моя программа должна знать на какую кнопку ей нажать. А это, как известно, можно сделать только в зависимости от того, какие кнопки сейчас видны на экране.

Подобные задачи проще решаются. Админы любят всякие проги кнопко-нажиматели типа такой. Создается на встроенном языке скрипт примерно такой: "запустить прогу, дождаться такого-то окошка, ввести тот-то и/или нажать такую-то кнопку."

В принципе можно самому написать, только не на фоксе. Надо использовать функцию EnumWindows() а фокс не умеет адреса функций передавать как параметр.