2017-04-16 2 views
0

Ich entwickle eine Anwendung, die ich Tesseract OCR verwenden, um einen Text in einem Bild zu erkennen. Ich habe es für Englisch und Japanisch getestet und es funktioniert gut, aber wenn ich arabisch versuchte, stürzte die Anwendung ab, bevor ich überhaupt startete! Warum?Tesseract erkennt arabischen Text in Android

Was ist los mit der arabischen Sprache und Tesseract OCR? Kann mir das bitte jemand sagen?

Code:

public class MainActivity extends AppCompatActivity { 

Bitmap image; 
private TessBaseAPI mTess; 
String datapath = ""; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //init image 
    image = BitmapFactory.decodeResource(getResources(), R.drawable.test_ara); 

    //initialize Tesseract API 
    String language = "ra"; 
    datapath = getFilesDir()+ "/tesseract/"; 
    mTess = new TessBaseAPI(); 

    checkFile(new File(datapath + "tessdata/")); 

    mTess.init(datapath, language); 
} 

public void processImage(View view){ 
    String OCRresult = null; 
    mTess.setImage(image); 
    OCRresult = mTess.getUTF8Text(); 
    TextView OCRTextView = (TextView) findViewById(R.id.OCRTextView); 
    OCRTextView.setText(OCRresult); 
} 

private void checkFile(File dir) { 
    if (!dir.exists()&& dir.mkdirs()){ 
      copyFiles(); 
    } 
    if(dir.exists()) { 
     String datafilepath = datapath+ "/tessdata/ara.traineddata"; 
     File datafile = new File(datafilepath); 

     if (!datafile.exists()) { 
      copyFiles(); 
     } 
    } 
} 

private void copyFiles() { 
    try { 
     String filepath = datapath + "/tessdata/ara.traineddata"; 
     AssetManager assetManager = getAssets(); 

     InputStream instream = assetManager.open("tessdata/ara.traineddata"); 
     OutputStream outstream = new FileOutputStream(filepath); 

     byte[] buffer = new byte[1024]; 
     int read; 
     while ((read = instream.read(buffer)) != -1) { 
      outstream.write(buffer, 0, read); 
     } 


     outstream.flush(); 
     outstream.close(); 
     instream.close(); 

     File file = new File(filepath); 
     if (!file.exists()) { 
      throw new FileNotFoundException(); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

Der Fehler Ich habe:

04-16 18:37:08.451 7405-7405/com.imperialsoupgmail.tesseractexample A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 7405 (esseractexample) 
+1

Veröffentlichen Sie den genauen Fehlertext, wenn es abstürzt. – sashoalm

+0

@ashoalm hat es gerade gepostet. –

Antwort

1

Für Arabisch, müssen Sie Cube verwenden: rufen init() den OEM_CUBE_ONLY Motor-Modus und verwenden Sie den Cube data files .

+0

Ich habe gerade den Code gepostet, kannst du mir bitte sagen, wo ich mich ändern soll und wie? oder gibt es gute Beispiele für die Verwendung des Cubes? –

+0

danke! jetzt klappt es :) aber die erkenntnis ist falsch! weißt du, warum? –

+0

kann ich nicht ohne weitere Informationen sagen. Stellen Sie eine neue Frage und fügen Sie alle Details hinzu. – rmtheis

Verwandte Themen