2017-03-16 1 views
0

불량 영어를 용서해주십시오.이 질문이 내 첫 번째 질문 인 stackoverflow에 게시되었습니다.원주민 : language = eng로 Tesseract API를 초기화 할 수 없습니다.

tesseract OCR 엔진을 사용하여 OCR Android 애플리케이션을 만들고 싶습니다. 다음 오류가 발생했습니다. 검색을 시도했지만 해결책을 찾을 수 없었습니다. 도움을 주시면 감사하겠습니다. 감사. 내가 노력하고

코드는 :

TessBaseAPI baseApi = new TessBaseAPI(); 
baseApi.init(Environment.getExternalStorageDirectory().toString()+"/", `"eng");` 

은 이미 내부 eng.traineddata 파일 내 장치의 루트에 tessdata 폴더를 만들었습니다,하지만 기능에 액세스 할 때 나는 다음과 같은 오류 메시지가 표시되었다.

language = eng 인 Tesseract API를 초기화 할 수 없습니다!

나는 23

어떤 도움을 주셔서 감사합니다겠습니까 API, 안드로이드 6.0.1 사용하고 있습니다! 미리 감사드립니다 ~

+0

외부 저장소에 액세스 할 수있는 권한이 있습니까? – zsmb13

+0

안녕하세요 @ zsmb13, 답장을 보내 주셔서 감사합니다. 매니페스트 파일에 포함 시켰지만 작동하지 않습니다. Java 파일에 권한 코드를 삽입했을 때 작동하는 것으로 밝혀졌습니다. 이게 내 문제를 해결했습니다! –

답변

1

이 코드를 사용해보십시오. 그림을 찍고 텍스트를 표시 할 수 있습니다.이 코드에는 사소한 버그가 있습니다.이 코드를 메모장에 입력 한 문자로 시도하십시오. tessdata 폴더에있는 다양한 파일을 무시하십시오. 나는 수학 방정식을 읽으려고 노력하고 있습니다. 그러므로 나는 그것을 필요로합니다. 나는 다른 파일들을 주석 처리했다. 그것은 당신을 귀찮게해서는 안된다. 시험해보고 싶다면 Mobile Vision API를 사용해보십시오. 희망 사항 :

public class MainActivity extends AppCompatActivity { 
    String imgPath; 
    Bitmap imgBitmap; 
    Uri imgUri; 
    InputStream trainDataInputStream; 
    OutputStream trainDataOutputStream; 
    AssetManager assetManager; 
    String externalDataPath; 
    TextView t; 
    String[] fileToBeCopied = {"eng.cube.bigrams", "eng.cube.fold", "eng.cube.lm", "eng.cube.nn", "eng.cube.params", "eng.cube.size", "eng.cube.word-freq", "eng.tesseract_cube.nn", "eng.traineddata","equ.traineddata"}; 
    ProgressDialog pDialog; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     t = (TextView) findViewById(R.id.text); 
     new CopyFile().execute(); 
     //placeFileFromAssetsToExternalStorage(); 
     takePicture(); 

    } 

    class CopyFile extends AsyncTask { 

     @Override 
     protected void onPreExecute() { 
      pDialog = new ProgressDialog(MainActivity.this); 
      pDialog.setMessage("Fetching image..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     @Override 
     protected Object doInBackground(Object[] objects) { 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[0]); 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[1]); 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[2]); 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[3]); 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[4]); 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[5]); 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[6]); 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[7]); 
      placeFileFromAssetsToExternalStorage(fileToBeCopied[8]); 
      //placeFileFromAssetsToExternalStorage(fileToBeCopied[9]); 

      return null; 
     } 


     @Override 
     protected void onPostExecute(Object o) { 
      pDialog.dismiss(); 

     } 
    } 

    private void takePicture() { 
     File photoFile = null; 
     Intent iPicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (iPicture.resolveActivity(getPackageManager()) != null) { 

      try { 
       photoFile = createImageFile(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      //if photo file is created 
      if (photoFile != null) { 
       Uri photoURI = FileProvider.getUriForFile(getApplicationContext(), "com.scorpio.fileprovider", photoFile); 
       System.out.println(imgPath); 
       iPicture.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
       startActivityForResult(iPicture, 1); 

      } 
     } 
    } 

    private File createImageFile() { 
     File imgFile = null; 
     String fileStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     File storageDir = Environment.getExternalStorageDirectory(); 
     try { 
      imgFile = File.createTempFile(fileStamp, ".jpeg", storageDir); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     imgPath = imgFile.getAbsolutePath(); 
     return imgFile; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1 && resultCode == RESULT_OK) { 
      galleryAddPic(); 
     } 
    } 

    private void galleryAddPic() { 
     Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     File f = new File(imgPath); 
     System.out.println("Image path ->" + imgPath); 
     Uri contentUri = Uri.fromFile(f); 
     imgUri = contentUri; 
     System.out.println("Image uri " + imgUri); 
     mediaScanIntent.setData(contentUri); 
     this.sendBroadcast(mediaScanIntent); 
     ocrImage(); 
    } 


    public void ocrImage() { 
     try { 
      //getting image for ocr 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 4; 
      imgBitmap = BitmapFactory.decodeFile(imgPath, options); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     ExifInterface exif = null; 
     try { 
      exif = new ExifInterface(imgPath); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     int exifOrientation = exif.getAttributeInt(
       ExifInterface.TAG_ORIENTATION, 
       ExifInterface.ORIENTATION_NORMAL); 

     int rotate = 0; 

     switch (exifOrientation) { 
      case ExifInterface.ORIENTATION_ROTATE_90: 
       rotate = 90; 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_180: 
       rotate = 180; 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_270: 
       rotate = 270; 
       break; 
     } 

     if (rotate != 0) { 
      int w = imgBitmap.getWidth(); 
      int h = imgBitmap.getHeight(); 

      // Setting pre rotate 
      Matrix mtx = new Matrix(); 
      mtx.preRotate(rotate); 

      // Rotating Bitmap & convert to ARGB_8888, required by tess 
      imgBitmap = Bitmap.createBitmap(imgBitmap, 0, 0, w, h, mtx, false); 
     } 
     imgBitmap = imgBitmap.copy(Bitmap.Config.ARGB_8888, true); 
     TessBaseAPI baseApi = new TessBaseAPI(); 
     baseApi.init(externalDataPath, "eng"); 
     baseApi.setImage(imgBitmap); 
     String ocrResult = baseApi.getUTF8Text(); 
     System.out.println(ocrResult); 
     baseApi.end(); 
     t.setText(ocrResult); 

    } 

    public void placeFileFromAssetsToExternalStorage(String filename) { 
     System.out.println("Running DataRunnable class "); 
     assetManager = getResources().getAssets(); 
     externalDataPath = Environment.getExternalStorageDirectory() + "/tessdata"; 
     System.out.println("external data path " + externalDataPath); 
     //creating eng.trainedData 
     File f = new File(externalDataPath); 
     try { 
      if (!f.exists()) { 
       f.mkdir(); 
      } 
      externalDataPath = externalDataPath + "/" + filename; 
      f = new File(externalDataPath); 

      if (!f.exists()) 
       f.createNewFile(); 

      externalDataPath = Environment.getExternalStorageDirectory().toString(); 

      trainDataInputStream = assetManager.open(filename); 
      trainDataOutputStream = new FileOutputStream(f); 
      byte[] buffer = new byte[1024]; 
      int read; 
      while ((read = trainDataInputStream.read(buffer)) != -1) { 
       trainDataOutputStream.write(buffer, 0, read); 
      } 
      trainDataOutputStream.flush(); 
      trainDataOutputStream.close(); 
      trainDataInputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
+0

안녕하세요, 귀하의 답장을 보내 주셔서 감사합니다. 문제가 발생하여 문제를 해결했습니다. 감사! –

관련 문제