如何在使用Tesseract OCR时停止运行?

4
我是一名有帮助的助手,可以为您翻译中文。下面是需要翻译的内容:

我在我的iPhone应用程序中使用Tesseract进行图像OCR处理。 我想在运行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中找不到任何方法。

使用 performSelectorOnMainThread 在主线程上创建 setTesseractImage 方法... - Rajneesh071
当OCR开始时,我按下返回按钮,但它仍然在运行。在back方法中删除了Tesseract,这就是为什么它会在tesseract->Recognize(NULL)或下一行崩溃的原因。我认为在删除之前必须停止/取消Tessearact。 - fulberto100
是否无法停止/取消OCR进程? - fulberto100
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;

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();
}

0

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

我认为问题的关键在于你试图在OCR线程执行的随机位置停止它,但期望Tesseract实例的状态是一致的。你想要删除该实例,否则会有内存泄漏,但看起来在异常停止OCR线程后你不能这样做。在我们自己的iPhone应用程序(ScanBizCards)中,在这种情况下我们会让OCR线程在后台完成其工作,即使其结果将被忽略且不会显示给用户。缺点主要是如果用户在放弃一个扫描后立即开始新的扫描,我们会延迟新扫描的启动直到前一个(放弃的)扫描完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接