Почему библиотека OCR Tesseract (iOS) не может распознать текст вообще?
Я пытаюсь использовать библиотеку Tesseract OCR
в приложении iOS. Я загрузил библиотеку tesseract-ios из github, и когда я попытался распознать простой текстовый образ, вместо этого я получил мусор. Вот изображение того, что я пытался распознать:
![enter image description here]()
Я получил нечитаемый текст:
T0I1101T0W KIR1 H1I1101T0W KIR1 H1I1101T0W CIBEPS H1 ES PBHY P306 EHH11 133I R1 11335 11I1H1 19 13S SYIL 3B19 M H300H1911 H1113 AIR1 J1 OIII 3I9SH5H133IS 13V9 I1 Q1H211 E015 19 W331 H1 111SW
Почему Tesseract не может распознать даже простой образ? Вот код, который я использовал для создания Tesseract:
Tesseract* tesseractObject = [[Tesseract alloc] initWithDataPath:@"tessdata" language:@"eng"];
[tesseractObject setVariableValue:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
[tesseractObject setImage:image];
[tesseractObject recognize];
NSLog(@"RECOGNISED= %@" , [tesseractObject recognizedText]);
Вот моя структура проекта:
![enter image description here]()
Я добавил английскую папку testdata по ссылке. Так что я делаю неправильно? Как я могу это исправить?
Ответы
Ответ 1
Убедитесь, что у вас есть последний файл tessdata из кода Google
http://code.google.com/p/tesseract-ocr/downloads/list
Это предоставит вам список файлов tessdata, которые необходимо загрузить и включить в приложение, если вы еще этого не сделали. В вашем случае вам понадобится tesseract-ocr-3.02.eng.tar.gz, поскольку вы ищете файлы на английском языке
В следующей статье вы увидите, где вам нужно ее установить. Я прочитал этот учебник, когда я построил свой первый проект Tesseract и нашел его действительно полезным
http://lois.di-qual.net/blog/install-and-use-tesseract-on-ios-with-tesseract-ios/
Ответ 2
Вы используете параметр tessedit_char_whitelist со значением "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", который ограничивает распознавание символов только этим списком. Однако изображение, которое вы хотите обработать, содержит символы нижнего регистра, если вы хотите использовать эту опцию, вам также придется включать в себя нижние регистры char.
[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
Ответ 3
Как сказал Адам, если вы хотите получить хорошие результаты, вам нужно будет выполнить некоторую обработку изображений и настроить некоторые параметры (белые листинга определенных символов и т.д.).
Для кого-то, кто наткнулся на этот вопрос, я собрал здесь образец проекта, который выполняет некоторую обработку белого изображения и изображения: https://github.com/mstrchrstphr/OCR-iOS-Example
Ответ 4
Вместо библиотеки OCR Tesseract вы можете использовать ABBYY Cloud OCR Sdk, чтобы распознать текст с изображения. Я пробовал в своем приложении, его работа отлично. Вы можете попробовать демо-версию, используя эту ссылку: https://github.com/abbyysdk/ocrsdk.com/tree/master/iOS/OcrSdkDemo
Эта информация действительно полезна для всех.
Ответ 5
![введите описание изображения здесь]()
и мой вывод
![введите описание изображения здесь]()
Решение:
tesseract.language = @"eng+fra";
tesseract.pageSegmentationMode = G8PageSegmentationModeAuto;
tesseract.engineMode = G8OCREngineModeTesseractCubeCombined;
tesseract.image = [image.image g8_blackAndWhite];
tesseract.maximumRecognitionTime = 60.0;
[tesseract recognize];
NSLog(@"%@", tesseract.recognizedText);
reco_area.text = [tesseract recognizedText];
для tessdata
нажмите здесь
Ответ 6
независимо от того, что объяснил Адам Ричардсон, правильно, вместе с этим добавьте этот 1) метод масштабирования для увеличения размера изображения (увеличение размеров)
func scaleImage (изображение: UIImage, maxDimension: CGFloat) → UIImage {
var scaledSize = CGSize(width: maxDimension, height: maxDimension)
var scaleFactor: CGFloat
if image.size.width > image.size.height {
scaleFactor = image.size.height / image.size.width
scaledSize.width = maxDimension
scaledSize.height = scaledSize.width * scaleFactor
} else {
scaleFactor = image.size.width / image.size.height
scaledSize.height = maxDimension
scaledSize.width = scaledSize.height * scaleFactor
}
UIGraphicsBeginImageContext(scaledSize)
image.draw(in: CGRect(x: 0, y: 0, width: scaledSize.width, height: scaledSize.height))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage!
}
2) сохраните этот языковой файл eng.traineddata в filemanager
func storeLanguageFile() throws{
var fileManager: FileManager = FileManager.default
let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
let docDirectory = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)[0] as NSString
let path: String = docDirectory.appendingPathComponent("/tessdata/eng.traineddata")
if fileManager.fileExists(atPath: path){
var data: NSData = NSData.dataWithContentsOfMappedFile((Bundle.main.resourcePath?.appending("/tessdata/eng.traineddata"))!)! as! NSData
var error: NSError
try FileManager.default.createDirectory(atPath: docDirectory.appendingPathComponent("/tessdata"), withIntermediateDirectories: true, attributes: nil)
data.write(toFile: path, atomically: true)
}
}
3) после этого вы можете использовать https://github.com/BradLarson/GPUImage для увеличить четкость изображения
вы можете использовать этот
func preprocessedImage(for tesseract: G8Tesseract!, sourceImage: UIImage!) -> UIImage! {
var stillImageFilter: GPUImageAdaptiveThresholdFilter = GPUImageAdaptiveThresholdFilter()
stillImageFilter.blurRadiusInPixels = 4.0
var filterImage: UIImage = stillImageFilter.image(byFilteringImage: sourceImage)
return filterImage
}
эти 3 шага помогут вам повысить точность tesseract до 60 ~ 70%