4

iPhoneアプリの画像OCRにtesseractを使用しています。実行中にすべての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がまだ実行されているためです。どうすれば止められますか?正八胞体で方法を見つけることができませんでした。

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

このプログラムは、2つのスレッドを使用した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 に答える