Обработка изображений с использованием Leptonica в проекте Xcode - PullRequest
1 голос
/ 21 марта 2011

В Xcode я пытаюсь предварительно обработать изображение перед отправкой в ​​OCR'ing.Механизм OCR, Tesseract, обрабатывает изображения на основе библиотеки Leptonica.

Например: функция Leptonica pixConvertTo8 ("image.tif") ... есть способ "передать" необработанные данные изображенияиз UIImage -> PIX (см. pix.h из библиотеки leptonica) -> выполнить pixConvertTo8 () и обратно из PIX -> UImage - и это предпочтительно без сохранения его в файл для перехода - все в памяти.

- (void) processImage:(UIImage *) uiImage
{
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

// preprocess UIImage here with fx: pixConvertTo8();

CGSize imageSize = [uiImage size];
int bytes_per_line  = (int)CGImageGetBytesPerRow([uiImage CGImage]);
int bytes_per_pixel = (int)CGImageGetBitsPerPixel([uiImage CGImage]) / 8.0;

CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider([uiImage CGImage]));
const UInt8 *imageData = CFDataGetBytePtr(data);

// this could take a while.
char* text = tess->TesseractRect(imageData,
                                 bytes_per_pixel,
                                 bytes_per_line,
                                 0, 0,
                                 imageSize.width, imageSize.height);

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

эти две функции сделают свое дело ....

- (void) startTesseract
{
//code from http://robertcarlsen.net/2009/12/06/ocr-on-iphone-demo-1043

NSString *dataPath = 
    [[self applicationDocumentsDirectory]stringByAppendingPathComponent:@"tessdata"];
/*
 Set up the data in the docs dir
 want to copy the data to the documents folder if it doesn't already exist
 */
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:dataPath]) {
    // get the path to the app bundle (with the tessdata dir)
    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
    NSString *tessdataPath = [bundlePath stringByAppendingPathComponent:@"tessdata"];
    if (tessdataPath) {
        [fileManager copyItemAtPath:tessdataPath toPath:dataPath error:NULL];
    }
}

NSString *dataPathWithSlash = [[self applicationDocumentsDirectory] stringByAppendingString:@"/"];
setenv("TESSDATA_PREFIX", [dataPathWithSlash UTF8String], 1);

// init the tesseract engine.
tess = new  tesseract::TessBaseAPI();
tess->Init([dataPath cStringUsingEncoding:NSUTF8StringEncoding], "eng");

}

- (NSString *) ocrImage: (UIImage *) uiImage
{

//code from http://robertcarlsen.net/2009/12/06/ocr-on-iphone-demo-1043
    CGSize imageSize = [uiImage size];
double bytes_per_line   = CGImageGetBytesPerRow([uiImage CGImage]);
double bytes_per_pixel  = CGImageGetBitsPerPixel([uiImage CGImage]) / 8.0;

CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider([uiImage CGImage]));
const UInt8 *imageData = CFDataGetBytePtr(data);
imageThresholder = new tesseract::ImageThresholder();       

imageThresholder->SetImage(imageData,(int) imageSize.width,(int) imageSize.height,(int)bytes_per_pixel,(int)bytes_per_line);



// this could take a while. maybe needs to happen asynchronously.
tess->SetImage(imageThresholder->GetPixRect());

char* text = tess->GetUTF8Text();
// Do something useful with the text!
NSLog(@"Converted text: %@",[NSString stringWithCString:text encoding:NSUTF8StringEncoding]);

return [NSString stringWithCString:text encoding:NSUTF8StringEncoding]
}

Вам нужно будет объявить и tess, и imageThresholder в файле .h

tesseract::TestBaseApi *tess;
tesseract::ImageThresholder *imageThresholder;
0 голосов
/ 29 марта 2011

Я нашел несколько хороших фрагментов кода в движке Tesseract OCR, чтобы узнать, как это сделать. Заметно в классе ImageThresholder внутри thresholder.cpp - см. Ссылку ниже. Я еще не тестировал, но вот краткое описание:

интересная часть для меня - блок else, в котором глубина равна 32. здесь pixCreate () pixGetdata () pixgetwpl () выполняет фактическую работу.

В thresholder.cpp из движка tesseract используется вышеупомянутый метод

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