2015-12-07 5 views
4

Я студент и новичок в разработке android и обязан выполнять функцию OCR для Android для приложения управления контактами для моего школьного проекта. Это для преобразования изображения в текст от имени карты.Android OCR: не удается разрешить ошибку для getBoundingBox

Я искал много форумов для информации об этом и нашел несколько хороших примеров такого.

В настоящее время я нашел открытый исходный код в Интернете, который не требует установки ndk и переменных окружения и т. Д. Для настройки. Однако, когда я реализовал его в eclipse (juno), есть небольшая ошибка, в которой я не уверен, как ее решить.

У меня есть довольно долгое время, без каких-либо результатов. Поэтому, решив спросить здесь. Ниже приведены коды с ошибкой.

final class OcrRecognizeAsyncTask extends AsyncTask<Void, Void, Boolean> { 

    // private static final boolean PERFORM_FISHER_THRESHOLDING = false; 
    // private static final boolean PERFORM_OTSU_THRESHOLDING = false; 
    // private static final boolean PERFORM_SOBEL_THRESHOLDING = false; 

    private CaptureActivity activity; 
    private TessBaseAPI baseApi; 
    private byte[] data; 
    private int width; 
    private int height; 
    private OcrResult ocrResult; 
    private long timeRequired; 

    OcrRecognizeAsyncTask(CaptureActivity activity, TessBaseAPI baseApi, byte[] data, int width, int height) { 
    this.activity = activity; 
    this.baseApi = baseApi; 
    this.data = data; 
    this.width = width; 
    this.height = height; 
    } 

    @Override 
    protected Boolean doInBackground(Void... arg0) { 
    long start = System.currentTimeMillis(); 
    Bitmap bitmap = activity.getCameraManager().buildLuminanceSource(data, width, height).renderCroppedGreyscaleBitmap(); 
    String textResult; 

    //  if (PERFORM_FISHER_THRESHOLDING) { 
    //  Pix thresholdedImage = Thresholder.fisherAdaptiveThreshold(ReadFile.readBitmap(bitmap), 48, 48, 0.1F, 2.5F); 
    //  Log.e("OcrRecognizeAsyncTask", "thresholding completed. converting to bmp. size:" + bitmap.getWidth() + "x" + bitmap.getHeight()); 
    //  bitmap = WriteFile.writeBitmap(thresholdedImage); 
    //  } 
    //  if (PERFORM_OTSU_THRESHOLDING) { 
    //  Pix thresholdedImage = Binarize.otsuAdaptiveThreshold(ReadFile.readBitmap(bitmap), 48, 48, 9, 9, 0.1F); 
    //  Log.e("OcrRecognizeAsyncTask", "thresholding completed. converting to bmp. size:" + bitmap.getWidth() + "x" + bitmap.getHeight()); 
    //  bitmap = WriteFile.writeBitmap(thresholdedImage); 
    //  } 
    //  if (PERFORM_SOBEL_THRESHOLDING) { 
    //  Pix thresholdedImage = Thresholder.sobelEdgeThreshold(ReadFile.readBitmap(bitmap), 64); 
    //  Log.e("OcrRecognizeAsyncTask", "thresholding completed. converting to bmp. size:" + bitmap.getWidth() + "x" + bitmap.getHeight()); 
    //  bitmap = WriteFile.writeBitmap(thresholdedImage); 
    //  } 

    try {  
     baseApi.setImage(ReadFile.readBitmap(bitmap)); 
     textResult = baseApi.getUTF8Text(); 
     timeRequired = System.currentTimeMillis() - start; 

     // Check for failure to recognize text 
     if (textResult == null || textResult.equals("")) { 
     return false; 
     } 
     ocrResult = new OcrResult(); 
     ocrResult.setWordConfidences(baseApi.wordConfidences()); 
     ocrResult.setMeanConfidence(baseApi.meanConfidence()); 
     ocrResult.setRegionBoundingBoxes(baseApi.getRegions().getBoxRects()); 
     ocrResult.setTextlineBoundingBoxes(baseApi.getTextlines().getBoxRects()); 
     ocrResult.setWordBoundingBoxes(baseApi.getWords().getBoxRects()); 
     ocrResult.setStripBoundingBoxes(baseApi.getStrips().getBoxRects()); 

     // Iterate through the results. 
     final ResultIterator iterator = baseApi.getResultIterator(); 
     int[] lastBoundingBox; 
     ArrayList<Rect> charBoxes = new ArrayList<Rect>(); 
     iterator.begin(); 
     do { 
      lastBoundingBox =iterator.getBoundingBox(PageIteratorLevel.RIL_SYMBOL); 
      Rect lastRectBox = new Rect(lastBoundingBox[0], lastBoundingBox[1], 
        lastBoundingBox[2], lastBoundingBox[3]); 
      charBoxes.add(lastRectBox); 
     } while (iterator.next(PageIteratorLevel.RIL_SYMBOL)); 
     iterator.delete(); 
     ocrResult.setCharacterBoundingBoxes(charBoxes); 

    } catch (RuntimeException e) { 
     Log.e("OcrRecognizeAsyncTask", "Caught RuntimeException in request to Tesseract. Setting state to CONTINUOUS_STOPPED."); 
     e.printStackTrace(); 
     try { 
     baseApi.clear(); 
     activity.stopHandler(); 
     } catch (NullPointerException e1) { 
     // Continue 
     } 
     return false; 
    } 
    timeRequired = System.currentTimeMillis() - start; 
    ocrResult.setBitmap(bitmap); 
    ocrResult.setText(textResult); 
    ocrResult.setRecognitionTimeRequired(timeRequired); 
    return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
    super.onPostExecute(result); 

    Handler handler = activity.getHandler(); 
    if (handler != null) { 
     // Send results for single-shot mode recognition. 
     if (result) { 
     Message message = Message.obtain(handler, R.id.ocr_decode_succeeded, ocrResult); 
     message.sendToTarget(); 
     } else { 
     Message message = Message.obtain(handler, R.id.ocr_decode_failed, ocrResult); 
     message.sendToTarget(); 
     } 
     activity.getProgressDialog().dismiss(); 
    } 
    if (baseApi != null) { 
     baseApi.clear(); 
    } 
    } 
} 

Ошибка заключается в делать и во время цикла:

do { 
      lastBoundingBox = iterator.***getBoundingBox***(PageIteratorLevel.RIL_SYMBOL); 
      Rect lastRectBox = new Rect(lastBoundingBox[0], lastBoundingBox[1], 
        lastBoundingBox[2], lastBoundingBox[3]); 
      charBoxes.add(lastRectBox); 
     } while (iterator.next(PageIteratorLevel.RIL_SYMBOL)); 
     iterator.***delete***(); 
     ocrResult.setCharacterBoundingBoxes(charBoxes); 

В приведенных выше кодах, как жирный шрифт, getBoundingBox и удаление имеет следующую ошибку:

«Метод getBoundingBox (Int) не определено для типа ResultIterator «

« Метод getBoundingBox (int) не определен для типа ResultIterator «

Я пробовал несколько методов, но просто не могу заставить его работать. Если есть какие-либо решения, пожалуйста, помогите мне, большое спасибо.

+0

Включите этот файл: https://github.com/rmtheis/tess-two/blob/master/tess-two/src/com/googlecode/tesseract/android/PageIterator.java –

+1

@Donovan Проблема может быть где происходит сборка библиотеки tesseract. API 'PageIterator' изменился между версиями и не всегда имел метод getBoundingBox. –

+0

@MorrisonChang Привет, вы имеете в виду, включая коды в ссылке, которую вы указали в моем проекте? Я пробовал это, добавив коды в качестве другого класса в проект, и getBoundingBox все еще имеет ту же ошибку. Очень ценю вашу помощь :) –

ответ

1

@SebastianRoth прав: предварительно скомпилированная библиотека, которую вы используете, устарела. Я предлагаю установить NDK и следовать за build instructions для двигателя OCR. Это перекомпилит библиотеку, включая ее метод getBoundingBox.

+0

Пробовал и работает сейчас, спасибо большое :) –