4

我在我的 iPhone 应用程序中使用 tesseract 进行图像 OCRing。我想在运行时停止所有 OCR 进程。

这是我的代码:

在 .h 文件中:

dispatch_queue_t main;
tesseract::TessBaseAPI *tesseract;
uint32_t *pixels;

在 .m 文件中:

- (void)processOcrAt:(UIImage *)image
{
    [self setTesseractImage:image];

    //char* utf8Text = tesseract->GetUTF8Text();
    //[self performSelector:@selector(ocrProcessingFinished:) withObject:[NSString stringWithUTF8String:utf8Text]];
    //dispatch_queue_t queue = dispatch_queue_create("com.awesome", 0);

    main = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(main, ^{
        tesseract->Recognize(NULL);
        char* utf8Text = tesseract->GetUTF8Text();
        [self performSelectorOnMainThread:@selector(ocrProcessingFinished:)
                               withObject:[NSString stringWithUTF8String:utf8Text]
                               waitUntilDone:NO];
        delete [] utf8Text;
    });


}

-(IBAction)backPressed:(id)sender{
    dispatch_release(main);
    tesseract->Clear();
    //tesseract->End();

    delete tesseract;
    tesseract = nil;
    delete pixels;
    [self.navigationController popViewControllerAnimated:YES];
}

当我在 ocr 运行时点击后退按钮时,它会崩溃。因为 ocr 仍在运行。我怎样才能阻止它?我在 tesseract 中找不到任何方法。

4

3 回答 3

1

Recognize() 函数中的 ETEXT_DESC 参数怎么样?(不确定当你写你的答案 fulberto100 时它是否在那里)。它是用于跟踪进度以及取消进度的监视器。它在 TessBaseAPI::ProcessPage 中使用。不过我自己没试过。

ETEXT_DESC monitor;
monitor.cancel = NULL;
monitor.cancel_this = NULL;
monitor.set_deadline_msecs(timeout_millisec);
// Now run the main recognition.
failed = Recognize(&monitor) < 0;
于 2013-09-19T00:03:43.450 回答
0

这是tesseract形式的答案: https ://groups.google.com/forum/?fromgroups=#!topic/tesseract-ocr/1uLF4BmmmUg

我认为问题的症结在于您试图在执行过程中随机停止 OCR 线程,但期望 Tesseract 实例的状态保持一致。您想要删除该实例是正确的,否则您会出现内存泄漏,但看起来您在异常停止 OCR 线程后无法执行此操作。在我们自己的 iPhone 应用程序 (ScanBizCards) 中,我们在这种情况下所做的是让 OCR 线程在后台完成其工作,即使它的结果将被忽略并且不会显示给用户。缺点主要是如果用户在中止扫描后立即开始新扫描,我们会延迟新扫描的开始,直到前一个(中止)扫描完成。

于 2012-09-04T11:53:31.140 回答
0

该程序解释了 Tesseract 使用两个线程处理页面的进度:

#include <baseapi.h>
#include <allheaders.h>
#include <iostream>
#include <thread>
using namespace std;
using namespace tesseract;           

//monitorProgress will show actual progress done by tesseract
void monitorProgress();

//Here image send to extract text
void tesseractProcessing();

TessBaseAPI *api;
ETEXT_DESC *monitor = new ETEXT_DESC();

int main()
{
    //This statement will launch multiple threads in loop
    thread t1(tesseractProcessing);
    thread t2(monitorProgress);
    std::cout << "The main function execution\n";
    t1.join();
    t2.join();
    return 0;
}

void monitorProgress()
{
    while (1)
    {        
        cout << "Current Progress :   " << monitor[0].progress << endl;      
    }
}     

void tesseractProcessing()
{
    api = new TessBaseAPI(); 
    Pix *image = pixRead("myimage.jpg");
    api->Init("tessdata", "eng", OEM_DEFAULT);      
    api->SetPageSegMode(PSM_AUTO);
    api->SetImage(image);

    api->Recognize(monitor);

    cout << "out from recognition"<<endl;

    ofstream myfile("myfile.html");
    if (myfile.is_open())
    {
        myfile << api->GetHOCRText(0);
    }
    myfile.close();
}
于 2016-09-05T12:29:40.637 回答