3

非同期呼び出しで Tesseract ライブラリを使用する Android 用のアプリを作成しています。OCR を実行する方法は、別のスレッドで呼び出すまでうまく機能します。私が得る例外は次のとおりです。

*1: java.Lang.Unsatisfiedlinkerror: ライブラリ opencv_core が見つかりません。[/vendor/lib/libopencv_core.so、/system/lib/libopencv_core.so]を試しました

2: System.TypeInitializationException: Emgu.CV.CvInvoke* の型初期化子によって例外がスローされました

私が使用しているコード:

protected override void OnStart()
{
    base.OnStart();
    ImageView testimage = FindViewById<ImageView>(Resource.Id.TestImage);
    testimage.SetImageBitmap(ScanImage);

    ThreadPool.QueueUserWorkItem(state => {
        PerformOCR();
    });
}

protected void PerformOCR() //object state
{
    //Get the tesseract directory
    Java.IO.File myDir = Android.OS.Environment.ExternalStorageDirectory;
    Tesseract _ocr = new Tesseract(myDir.ToString() + "/tesseract/", "eng", Tesseract.OcrEngineMode.OEM_TESSERACT_CUBE_COMBINED);

    //Image optimization
    Image<Gray, Byte> passport = new Image<Gray, Byte>(ScanImage);
    Image<Gray, float> sobel = passport.Sobel(1, 0, 5);
    sobel.Add(passport.Sobel(0, 1, 5));
    passport = passport.Add(sobel.Convert<Gray, byte>());           

    _ocr.Recognize(passport);
    string text = _ocr.GetText();
    RunOnUiThread(() => SpecificationsText.Text = text); 
}

OCR で使用される画像は、静的クラスに格納されます。

4

1 に答える 1

1

わかりました、私は自分の問題を解決しました。

何らかの理由で、tesseract の初期化を非同期メソッドで実行できないため、メソッド呼び出しから初期化を削除し、別の場所で実行することで問題が解決しました。

protected override void OnStart()
{
    base.OnStart();
    ImageView testimage = FindViewById<ImageView>(Resource.Id.TestImage);
    testimage.SetImageBitmap(ScanImage);

    //Get the tesseract directory
    Java.IO.File myDir = Android.OS.Environment.ExternalStorageDirectory;
    Tesseract _ocr = new Tesseract(myDir.ToString() + "/tesseract/", "eng", Tesseract.OcrEngineMode.OEM_TESSERACT_CUBE_COMBINED);

    ThreadPool.QueueUserWorkItem(state => {
        PerformOCR(_ocr);
    });
}

protected void PerformOCR(Tesseract _ocr)
{
    //Image optimization
    Image<Gray, Byte> passport = new Image<Gray, Byte>(ScanImage);
    Image<Gray, float> sobel = passport.Sobel(1, 0, 5);
    sobel.Add(passport.Sobel(0, 1, 5));
    passport = passport.Add(sobel.Convert<Gray, byte>());           

    _ocr.Recognize(passport);
    string text = _ocr.GetText();
    RunOnUiThread(() => SpecificationsText.Text = text); 
}
于 2012-09-20T11:54:50.060 に答える