среда, 15 октября 2014 г.

Использование Free GOCR (распознавание текста)

Для распознавания текста можно задействовать внешние бесплатные утилиты. Одной из таких FREE-утилилит является GOCR. GOCR - это консольная программа, конвертирующая (распознающая) сканированный текст в текстовый файл. Имеет несколько графических интерфейсов.


Лицензия: GPL.
Офсайт: http://jocr.sourceforge.net/download.html.







Ближе к практике...

Собственно, рассмотрим параметры командной строки GOCR:


Ничего особо сложного:
gocr.exe -i file.pnm -c
выдаст код на экран, если перенаправить вывод в файл '1.txt', то:
gocr.exe -i file.pnm -c >1.txt
Но вы сразу спросите: и где же этот PNM* взять? Ведь у нас "капча", к примеру в формате PNG.
PNM (portable anymap) - простые форматы хранения изображений portable pixmap: цветных (PPM), полутоновых (PGM) и черно-белых (PBM) и определяют правила для обмена графическими файлами. Эти форматы могут обеспечивать промежуточное представление данных при конвертации растровых графических файлов трёх перечисленных типов между разными платформами. Некоторые приложения поддерживают эти три формата напрямую, определяя их, как формат PNM (portable anymap). Формат PPM был разработан Джефом Посканзером (англ. Jeff Poskanzer).

http://ru.wikipedia.org/wiki/Portable_anymap
Воспользуемся свободной утилиткой 'png2pnm'. Рассмотрим ее параметры запуска:


Другими словами, в командной строке:
png2pnm.exe file.png file.pnm
То что нам и нужно. Перепишем наш код в батнике следующим образом:
@echo off
if not exist *.png goto quit
for %%s in (*.png) do png2pnm %%s %%s.pnm
for %%s in (*.pnm) do gocr -i %%s -c >%%s.txt
for %%s in (*.pnm) do del %%s
И сохраним текстовый файл под именем 'recognition2.bat'. Как видите:
  1. Сначала мы проверим наличие PNG- файлов
  2. Потом переберем все имеющиеся PNG и последовательно запустим на конвертацию в формат PNM
  3. Далее запустим по циклу имеющихся PNM распознавание через утилиту <gocr> и выведем распознанный текст в отдельные текстовые файлы
  4. Подчистим за собой (удалим промежуточные PNM)
Проведем тесты

Итак, для тестов возьмем следующие изображения:


Запустим наш скрипт 'recognition2.bat'. Cоздастся набор распознанных текстовых файлов:


Рассмотрим содержимое:
 What the difference between must and have to? Or it's simply
 synonyms.
 Who can explain?

 ''have to'' Moxewb ncnonb3oB_b B n_6b_x BpeMeHax, a must
 HeT.
 _
 Italy


 _Adnkronos Incernaciona! AKI
 Independent news agency.

 _A_enzia Giorna!iscica Ica!ia AGI
 Special news service on behalf of the Ital ian Prime Minister's
 office.

 _ANSA - A_enzia Nazionale Stam_a Associata
 National news agency.

 CEorriere de!!a Sera
 n9l iSh lan9Ua9e SeCtiOn Of Wel l knOWn natiOnal Ital ian
 newspaper. Published daily in Milan.
Предварительные выводы

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

Модифицируем пакетную обработку:
  1. В части всеядности на форматы JPG + BMP + PNG + TIF средствами GDI+
  2. Перенаправим распознанный текст в текстовый файл средствами самой утилиты GOCR, путем использования флага "-o filename".
Напишем небольшую утилиту:
//---------------------------------------------------------------------------------------
// RUN-GOCR
// Модуль консольного запуска распознавания утилитой GOCR
// Author: Бадло Сергей Григорьевич
// H-mail: http://raxp.radioliga.com
// Cистемные требования: Win32/64
//---------------------------------------------------------------------------------------

program run_gocr;

uses sysutils,shellapi,classes,
     GDIPAPI, GDIPOBJ, GDIPUTIL;


var // вводим класс для работы с GDI+
    encoderClsid: TGUID;
    Image: TGPImage;


// универсальная процедура конвертации графических форматов
// в формат PNG средставми GDI+
function gdi_convert_to_png(filename: string): string;
var s: string;
begin
 result:= '';
 try
  Image := TGPImage.Create(filename);
  GetEncoderClsid('image/png', encoderClsid);
  s:= extractfilename(filename);
  result:= copy(s,1,length(s)-4) + '.png';
  image.Save(result, encoderClsid, nil);
  image.Free
 except end
end;


// поиск вложений-
procedure recurs(_dir,mask: string;_dest: TStrings;_subDirs:boolean);
var _sr: TSearchRec;
    _l : longint;
    _i : integer;

function ExtMatch(_fileext, _exts: string; _delimiter: char): boolean;
var _pos : longint;
begin
  Result:= false;
  //Check strings
  if (length(_fileext) = 0) or (length(_exts) = 0) then exit;
  //Rewrite strings
  _fileext := _delimiter + UpperCase(_fileext) + _delimiter;
  _exts := _delimiter + UpperCase(_exts) + _delimiter;
  //Search
  _pos := Pos(_fileext, _exts);
  //Found
  Result := (_pos <> 0);
end;

begin
 _l:= length(_dir);
 if (_l=0) then exit;
 //rewrite path
 if (_dir[_l]<>':')and(_dir[_l]<>'\') then _dir:=_dir+'\';
 //Add files.
 _i:=FindFirst(_dir+'*.*',$37,_sr);
 while (_i=0) do
  begin
   //it's a directory
   if (_sr.Attr and $10 = $10) and (_sr.name <> '.') and
      (_sr.name <> '..') and (_subdirs)
       then recurs(_dir + _sr.name,mask,_dest,_subdirs) else
        if ExtMatch(ExtractFileExt(_sr.name),mask, ';') then
         if _dest.IndexOf(_dir + _sr.name) = -1
          then _dest.Add(_dir + _sr.name);
     _i:= FindNext(_sr);
   end;
 FindClose(_sr);
end;


// сохраняем распознанный текст-
procedure slog(text, filename: string);
var f : textfile;
begin
 AssignFile(f, filename);
 ReWrite(f);
 Writeln(f, text);
 CloseFile(f)
end;


// ===========================================
var path, s, text: string;
    t            : tstringlist;
    i            : integer;
begin
 s:= '';
 text:= '';
 path:= ExtractFilePath(paramstr(0));
 t:= tstringlist.Create;

 // ищем все графические форматы-
 recurs(path,'.bmp;.jpg;.tif;.png;.jpeg;', t, false);
 for i:= 0 to t.Count-1 do
  // конвертируем в формат PNG
  if extractfileext(t[i])<>'.png' then gdi_convert_to_png(t[i]);
 t.Clear;

 // ищем все файлы формата PNG и
 // запускаем приложение <png2pnm> с параметрами командной строки-
 recurs(path,'.png;', t, false);
 for i:= 0 to t.Count-1 do begin
  s:= copy(t[i],1,length(t[i])-4) + '.pnm';
  text:= copy(t[i], 1, length(t[i])-4) + '.txt';
  shellexecute(0, 'open',
               pansichar(path + 'png2pnm.exe'),
               pansichar(extractfilename(t[i]) + ' ' + extractfilename(s)),
               pansichar(path),
               0);

  // запускаем процесс распознавания через GOCR-
  // и сохраняем распознанный текст (перенаправляем через STDOUT)-
  shellexecute(0, 'open',
               pansichar(path + 'gocr.exe'),
               pansichar('-i '+ extractfilename(s) + ' -o ' + extractfilename(text)),
               pansichar(path),
               0);
  sleep(500);
  // подчищаем промежуточные PNM
  deletefile(PChar(s));
 end;
 t.Clear;

 t.Free
end.
Видео


забрать

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.