Подтвердить что ты не робот

Почему библиотека 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 по ссылке. Так что я делаю неправильно? Как я могу это исправить?

4b9b3361

Ответ 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%