Что нового

OCR, распознование текста - как?

Shinoby

Новичок
Сообщения
81
Репутация
2
приветствую.
возникла потребность в распознавании текста (в основном английский, русский) и чисел, в объеме 1 строки (максимум до 5 слов)
однако ничего подходящего не нашел. есть ссылка на библиотеку созданную 5 лет назад, и ничего более свежего.

если у когото была такая задача - прошу поделиться решением.

зы. сам все что смог напридумывать это использование программных распознавателей, но это очнь долго и не надежно.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Shinoby,
Вы бы пару картинок с текстом показали.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Есть мимолетные, пятиминутные наработки, однако я их не развивал:

Код:
#Include <GDIPlus.au3>
#include <Clipboard.au3>

Local $sTifFile, $sText

_GDIPlus_Startup()
While Sleep( 10 )
	$sTifFile = _AutCaptcha_FromClip()
	If $sTifFile Then
		$sText = _AutCaptcha_Tesseract( $sTifFile )
		; -
		SplashOff()
		If StringRegExp( $sText, "^(\d+)$" ) Then
			SplashTextOn( "OK!", $sText, 100, 80, 0, 500, 4, "")
		Else
			SplashTextOn( "FAIL!", $sText, 100, 80, 0, 500, 4, "")
		EndIf
		ClipPut( $sText )
		; -
		FileDelete( $sTifFile )
	EndIf
WEnd
_GDIPlus_Shutdown()


; ### AutCaptcha_API by Firex
Func _AutCaptcha_FromClip()
	Local $hBitmap, $hImage
	; ---
    If _ClipBoard_Open(0) Then
		$hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
		If Not IsPtr($hBitmap) Then _
			Return

		$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
		_ClipBoard_Close()
		If IsPtr($hImage) Then
			_WinAPI_DeleteObject($hBitmap)
		Else
			Return
		EndIf
		Return _AutCaptcha_Convert( $hImage )
	EndIf
	Return
EndFunc

Func _AutCaptcha_Convert( $hImage )
	Local $sCLSID, $tParams, $pParams, $iW, $iH, _
		$sPath = @TempDir & "\" & Random( 1, 99, 1 ) & ".tif", _
		$iScale = 1.2
	; ---
	$iW = _GDIPlus_ImageGetWidth( $hImage )
	$iH = _GDIPlus_ImageGetHeight( $hImage )

	$hContext = _GDIPlus_ImageGetGraphicsContext($hImage)
	$hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW*$iScale,$iH*$iScale,$hContext)
	$hNewContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
	_GDIPlus_GraphicsDrawImageRect($hNewContext,$hImage,0,0,$iW*$iScale,$iH*$iScale)

	$tParams = _GDIPlus_ParamInit(2)
	$tData = DllStructCreate("int ColorDepth;int Compression")
		$tData.ColorDepth = 24
		$tData.Compression = $GDIP_EVTCOMPRESSIONNONE
	; *
	_GDIPlus_ParamAdd($tParams, $GDIP_EPGCOLORDEPTH, 1, $GDIP_EPTLONG, DllStructGetPtr($tData, "ColorDepth"))
	_GDIPlus_ParamAdd($tParams, $GDIP_EPGCOMPRESSION, 1, $GDIP_EPTLONG, DllStructGetPtr($tData, "Compression"))
	; *
	$sCLSID = _GDIPlus_EncodersGetCLSID("TIF")
	_GDIPlus_ImageSaveToFileEx($hBitmap, $sPath, $sCLSID, DllStructGetPtr($tParams))

	_GDIPlus_GraphicsDispose($hContext)
	_GDIPlus_GraphicsDispose($hNewContext)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_ImageDispose($hImage)
	; ---
	Return $sPath
EndFunc

Func _AutCaptcha_Tesseract( $sTifImg )
	Local $sRet, $iPid, $sTxt = $sTifImg & ".txt"
	; ---
	$iPid = Run( @ProgramFilesDir & '\Tesseract-OCR\tesseract.exe "' & $sTifImg & '" "' & $sTifImg & '"', @ProgramFilesDir & '\Tesseract-OCR', @SW_HIDE )
	While ProcessExists( $iPid ) And Sleep( 100 )
		;Nothing
		WEnd

	$sRet = FileRead( $sTxt )
	FileDelete( $sTxt )
	; ---
	Return $sRet ;_AutCaptcha_PostFilter( $sRet )
EndFunc

Func _AutCaptcha_PostFilter( $sText )
	Local $aLib[12][2] = [ [11], _
		[ "\%", 8 ], _
		[ "\'!", 7 ], _
		[ "\’", "" ], _
		[ "A", "4" ], _
		[ "Q", "9" ], _
		[ "O", "0" ], _
		[ "J", "1" ], _
		[ "b", "6" ], _
		[ "S", "5" ], _
		[ "\:", "" ], _
		[ "\/.", "4" ] ], $Idx
	; ---
	$sText = StringStripWS( $sText, 8 )
	For $Idx = 1 To $aLib[0][0] Step 1
		$sText = StringRegExpReplace( $sText, $aLib[$Idx][0], $aLib[$Idx][1] )
	Next
	Return $sText
EndFunc


1) Установи https://code.google.com/p/tesseract-ocr/
2) Запусти скрипт;
3) Копируй в буфер изображения ( к примеру в браузере функция "Копировать изображение" ).
 
Автор
S

Shinoby

Новичок
Сообщения
81
Репутация
2
текст такой как во вложении.

относительно гугла - есть ли там ограничения на количество или частоту обращения?

упд. про гугл я видимо сглупил? обращение идет к локальной проге же?
 

Вложения

  • ocr2.jpg
    ocr2.jpg
    1.7 КБ · Просмотры: 32
  • ocr3.jpg
    ocr3.jpg
    1.6 КБ · Просмотры: 447

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Shinoby
К локальной ( устанавливается на компьютер ). Проверил ваши изображения - успешно распознало второй вариант. ( iScale = 1 )

P.S. Откуда берете изображения? Полагаю, что это некое приложение. Так почему бы не читать это прямо из памяти?
С распознаванием текста вы далеко не продвинетесь.
 
Автор
S

Shinoby

Новичок
Сообщения
81
Репутация
2
да это игруха, на компе под эмулятором - только картинкой можно.

буду пробовать хоть как. спс.
 
Автор
S

Shinoby

Новичок
Сообщения
81
Репутация
2
руки добрались до этого вопроса. тессеракт установил, результат как описан выше.
логично, что его можно обучить, но описание процесса достаточно туманно...
на русском в инете не нашел, все больше вопросы как это сделать.

если есть хоть что-то проливающие свет на процесс обучения - думаю это будет всем полезно.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Shinoby
Вот пример и облегчённая UDF (основная в стадии разработки), в ней функции для базового примера.
Для вашей задачи вполне приемлемый вариант. Сразу оговорюсь, картинки лучше сохранять в TIF

Код:
#include 'Tesseract.au3'

$sText = ""
;~ $sFilePath = @ScriptDir & "\ocr2.tif"
$sFilePath = @ScriptDir & "\ocr3.tif"

_TessStart()

$hPix = _PixRead($sFilePath)
If @error Then
   ConsoleWrite(StringFormat('--> ERROR reading image\n'))
EndIf

$hTess = _TessBaseAPICreate()
If @error Then
   ConsoleWrite(StringFormat('--> ERROR Base API Create\n'))
EndIf

_TessBaseAPIInit3($hTess)
If @error Then
   ConsoleWrite(StringFormat('--> ERROR initialising tesseract\n'))
EndIf

_TessBaseAPISetImage2($hTess, $hPix)
_TessBaseAPIRecognizet($hTess)
If @error Then
   ConsoleWrite(StringFormat('--> ERROR in Tesseract recognition\n'))
Else
   $sText = _TessBaseAPIGetUTF8Text($hTess)
   If @error Then
	  ConsoleWrite(StringFormat('--> ERROR getting tex\n'))
   Else
	  MsgBox(64, 'OCR: Outpu text', $sText)
   EndIf
EndIf

_TessDeleteText($sText)
_TessBaseAPIEnd($hTess)
_TessBaseAPIDelete($hTess)
_PixFreeData($hPix)
_TessShutdown()

Tesseract.zip
 

belbix

Новичок
Сообщения
9
Репутация
0
Garrett
Это лучшее решение что я нашел! А искал я неделю наверное :smile:
Но иногда не распознается текст, я уже все голову сломал...
Изображения практически идентичные, пробовал преобразовывать в монохром, по нулям.
drive.google.com/file/d/0B2vBMfX74kavb3l5WWw4QTFLa00/view?usp=sharing распознается
drive.google.com/file/d/0B2vBMfX74kavNlZ0Sy1lR2JOcjQ/view?usp=sharing не распознается

И еще, почему то функция _TessDeleteText() приводит к крешу скрипта, я ее просто не прописываю, но если вызывать распознавание сильно часто, то программа вылетает.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
belbix [?]
drive.google.com/file/d/0B2vBMfX74kavNlZ0Sy1lR2JOcjQ/view?usp=sharing не распознается
Добавьте в папку tessdata поддержку русского языка.
Измените в примере выше:
Код:
;...
_TessBaseAPIInit3($hTess, '', 'rus')
;...


почему то функция _TessDeleteText() приводит к крешу скрипта
Понял, посмотрю. Пока можете использовать вместо:
Код:
;...
;_TessDeleteText($sText)
$sText = ''
;...
 

belbix

Новичок
Сообщения
9
Репутация
0
Частично удалось решить проблему "костылями:
Убрал проверки ошибок --> ERROR in Tesseract recognition и --> ERROR getting tex
Оказалось что функция возвращает данные, но вместо двойки ставила Z и вместо пятерки S, причем не всегда :smile:
Написал просто замену этих букв на цифры, пока полет нормальный :IL_AutoIt_1:
Только вот боюсь что русский язык сейчас поставлю - будут другие глюки))

Пытался разобраться как обучить Tesseract, но тут используются прямое обращение к dll, даже не знаю с чего подступиться.

Был бы рад пинку в нужном направлении!
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
belbix [?]
Только вот боюсь что русский язык сейчас поставлю - будут другие глюки
Не бойтесь.
После добавления русского языка
[?]
drive.google.com/file/d/0B2vBMfX74kavNlZ0Sy1lR2JOcjQ/view?usp=sharing не распознается
распознается на 100%

Пытался разобраться как обучить Tesseract
Training tesseract
 

AlexNrt12

Новичок
Сообщения
2
Репутация
0
Shinoby сказал(а):
приветствую.
возникла потребность в распознавании текста (в основном английский, русский) и чисел, в объеме 1 строки (максимум до 5 слов)
однако ничего подходящего не нашел. есть ссылка на библиотеку созданную 5 лет назад, и ничего более свежего.

если у когото была такая задача - прошу поделиться решением.

зы. сам все что смог напридумывать это использование программных распознавателей, но это очнь долго и не надежно.
вот ссылка на обучение tesseract
findevelop.blogspot.com/2013/04/tesseract.html
помоги и мне, пожалуйста, автоматизировать распознавание с возможностью вставки в поле текста :IL_AutoIt_1:
 
Верх