@SmallTest
  public void testWordConfidences() {
    final String inputText = "one two three";
    final Bitmap bmp = getTextImage(inputText, 640, 480);

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_BLOCK);

    baseApi.setImage(bmp);
    String text = baseApi.getUTF8Text();

    assertNotNull("Recognized text is null.", text);

    // Ensure that a mean confidence value is returned.
    int conf = baseApi.meanConfidence();
    boolean validConf = conf > 0 && conf <= 100;
    assertTrue("Mean confidence value is incorrect.", validConf);

    // Ensure that word confidence values are returned.
    int numWords = text.split("\\s+").length;
    int[] wordConf = baseApi.wordConfidences();
    assertEquals("Found the wrong number of word confidence values.", numWords, wordConf.length);
    for (int i = 0; i < wordConf.length; i++) {
      boolean valid = 0 <= wordConf[i] && wordConf[i] <= 100;
      assertTrue("Found an invalid word confidence value.", valid);
    }

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }
  @SmallTest
  public void testProgressValues() {
    final String inputText = "hello";
    final Bitmap bmp = getTextImage(inputText, 640, 480);
    final Rect imageBounds = new Rect(0, 0, bmp.getWidth(), bmp.getHeight());

    class Notifier implements ProgressNotifier {
      public boolean receivedProgress = false;

      @Override
      public void onProgressValues(ProgressValues progressValues) {
        receivedProgress = true;
        testProgressValues(progressValues, imageBounds);
      }
    }

    final Notifier notifier = new Notifier();

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI(notifier);
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
    baseApi.setImage(bmp);

    // Ensure that we receive a progress callback.
    baseApi.getHOCRText(0);
    assertTrue(notifier.receivedProgress);

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }
  @SmallTest
  public void testEnd() {
    final String inputText = "hello";
    final Bitmap bmp = getTextImage(inputText, 640, 480);

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
    baseApi.setImage(bmp);

    // Ensure that getUTF8Text() fails after end() is called.
    baseApi.end();
    try {
      baseApi.getUTF8Text();
      fail("IllegalStateException not thrown");
    } catch (IllegalStateException e) {
      // Continue
    } finally {
      bmp.recycle();
    }

    // Ensure that reinitializing the API is successful.
    boolean success = baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    assertTrue("API failed to initialize after end()", success);

    // Ensure setImage() does not throw an exception.
    final Bitmap bmp2 = getTextImage(inputText, 640, 480);
    baseApi.setImage(bmp2);

    // Attempt to shut down the API.
    baseApi.end();
    bmp2.recycle();
  }
  @SmallTest
  public void testSetRectangle() {
    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_CHAR);

    final int width = 640;
    final int height = 480;
    final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    final Paint paint = new Paint();
    final Canvas canvas = new Canvas(bmp);

    canvas.drawColor(Color.WHITE);

    paint.setColor(Color.BLACK);
    paint.setStyle(Style.FILL);
    paint.setAntiAlias(true);
    paint.setTextAlign(Align.CENTER);
    paint.setTextSize(32.0f);

    // Draw separate text on the left and right halves of the image.
    final String leftInput = "A";
    final String rightInput = "B";
    canvas.drawText(leftInput, width / 4, height / 2, paint);
    canvas.drawText(rightInput, width * 3 / 4, height / 2, paint);

    baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, leftInput + rightInput);
    baseApi.setImage(bmp);

    // Ensure the result is correct for a rectangle on the left half of the image.
    Rect left = new Rect(0, 0, width / 2, height);
    baseApi.setRectangle(left);
    String leftResult = baseApi.getUTF8Text();
    assertEquals("Found incorrect text.", leftInput, leftResult);

    // Ensure the result is correct for a rectangle on the right half of the image.
    Rect right = new Rect(width / 2, 0, width, height);
    baseApi.setRectangle(right);
    String rightResult = baseApi.getUTF8Text();
    assertEquals("Found incorrect text.", rightInput, rightResult);

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }
  @SmallTest
  public void testSetVariable() {
    final String inputText = "hello";
    final Bitmap bmp = getTextImage(inputText, 640, 480);

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);

    // Ensure that setting the blacklist variable works.
    final String blacklistedCharacter = inputText.substring(1, 2);
    baseApi.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, blacklistedCharacter);
    baseApi.setImage(bmp);
    final String outputText = baseApi.getUTF8Text();
    assertFalse("Found a blacklisted character.", outputText.contains(blacklistedCharacter));

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }
  @SmallTest
  public void testSetPageSegMode() {
    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);

    // Check the default page segmentation mode.
    assertEquals(
        "Found unexpected default page segmentation mode.",
        baseApi.getPageSegMode(),
        DEFAULT_PAGE_SEG_MODE);

    // Ensure that the page segmentation mode can be changed.
    final int newPageSegMode = TessBaseAPI.PageSegMode.PSM_SINGLE_CHAR;
    baseApi.setPageSegMode(newPageSegMode);
    assertEquals(
        "Found unexpected page segmentation mode.", baseApi.getPageSegMode(), newPageSegMode);

    // Attempt to shut down the API.
    baseApi.end();
  }
  @SmallTest
  public void testClear() {
    final String inputText = "hello";
    final Bitmap bmp = getTextImage(inputText, 640, 480);

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
    baseApi.setImage(bmp);

    // Ensure that the getUTF8Text() operation fails after clear() is called.
    baseApi.clear();
    String text = baseApi.getUTF8Text();

    assertNull("Received non-null result after clear().", text);

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }
  @SmallTest
  public void testChoiceIterator() {
    final String inputText = "hello";
    final Bitmap bmp = TessBaseAPITest.getTextImage(inputText, 640, 480);

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TessBaseAPITest.TESSBASE_PATH, TessBaseAPITest.DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
    baseApi.setVariable(TessBaseAPI.VAR_SAVE_BLOB_CHOICES, TessBaseAPI.VAR_TRUE);

    // Ensure that text is recognized.
    baseApi.setImage(bmp);
    String recognizedText = baseApi.getUTF8Text();
    assertTrue("No recognized text found.", recognizedText != null && !recognizedText.equals(""));

    // Iterate through the results.
    ResultIterator iterator = baseApi.getResultIterator();
    List<Pair<String, Double>> choicesAndConfidences;
    iterator.begin();
    do {
      choicesAndConfidences = iterator.getChoicesAndConfidence(PageIteratorLevel.RIL_SYMBOL);
      assertNotNull("Invalid result.", choicesAndConfidences);

      for (Pair<String, Double> choiceAndConfidence : choicesAndConfidences) {
        String choice = choiceAndConfidence.first;
        Double conf = choiceAndConfidence.second;
        assertTrue("No choice value found.", choice != null && !choice.equals(""));
        assertTrue("Found an incorrect confidence value.", conf >= 0 && conf <= 100);
      }
    } while (iterator.next(PageIteratorLevel.RIL_SYMBOL));
    iterator.delete();

    assertNotNull("No ChoiceIterator values found.", choicesAndConfidences);

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }
  private void testGetHOCRText(String language, int ocrEngineMode) {
    final String inputText = "hello";
    final Bitmap bmp = getTextImage(inputText, 640, 480);

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
    baseApi.setImage(bmp);

    // Ensure that getHOCRText() produces a result.
    final String hOcr = baseApi.getHOCRText(0);
    assertNotNull("HOCR result not found.", hOcr);
    assertTrue(hOcr.length() > 0);

    final String outputText = Html.fromHtml(hOcr).toString().trim();
    assertEquals(inputText, outputText);

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }
Example #10
0
  @SmallTest
  public void testProgressValues_setRectangle() {
    class Notifier implements ProgressNotifier {
      public boolean receivedProgress = false;
      private Rect bounds;

      public void reset(Rect bounds) {
        this.bounds = bounds;
        receivedProgress = false;
      }

      @Override
      public void onProgressValues(ProgressValues progressValues) {
        receivedProgress = true;
        testProgressValues(progressValues, bounds);
      }
    }

    final Notifier notifier = new Notifier();

    final int width = 640;
    final int height = 480;
    final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

    final Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setStyle(Style.FILL);
    paint.setAntiAlias(true);
    paint.setTextAlign(Align.CENTER);
    paint.setTextSize(32.0f);

    // Draw separate text on the left and right halves of the image.
    final Canvas canvas = new Canvas(bmp);
    canvas.drawColor(Color.WHITE);
    final String leftInput = "A";
    final String rightInput = "B";
    canvas.drawText(leftInput, width / 4, height / 2, paint);
    canvas.drawText(rightInput, width * 3 / 4, height / 2, paint);

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI(notifier);
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
    baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, leftInput + rightInput);
    baseApi.setImage(bmp);

    // Attempt to restrict recognition to a sub-rectangle of the image.
    final Rect left = new Rect(0, 0, width / 2, height);
    baseApi.setRectangle(left);
    notifier.reset(left);

    // Ensure a progress callback is received.
    baseApi.getHOCRText(0);
    assertTrue(notifier.receivedProgress);

    // Attempt to restrict recognition to a sub-rectangle of the image.
    final Rect right = new Rect(width / 2 + 5, 7, width - 5, height - 7);
    baseApi.setRectangle(right);
    notifier.reset(right);

    // Ensure a progress callback is received.
    baseApi.getHOCRText(0);
    assertTrue(notifier.receivedProgress);

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }
Example #11
0
  private void testGetUTF8Text(String language, int ocrEngineMode) {
    final String inputText = "hello";
    final Bitmap bmp = getTextImage(inputText, 640, 480);

    // Attempt to initialize the API.
    final TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, language, ocrEngineMode);
    baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
    baseApi.setImage(bmp);

    // Ensure that the result is correct.
    final String outputText = baseApi.getUTF8Text();
    assertEquals("\"" + outputText + "\" != \"" + inputText + "\"", inputText, outputText);

    // Ensure getRegions() works.
    final Pixa regions = baseApi.getRegions();
    assertEquals("Found incorrect number of regions.", regions.size(), 1);
    regions.recycle();

    // Ensure getTextlines() works.
    final Pixa textlines = baseApi.getTextlines();
    assertEquals("Found incorrect number of textlines.", textlines.size(), 1);
    textlines.recycle();

    // Ensure getStrips() works.
    final Pixa strips = baseApi.getStrips();
    assertEquals("Found incorrect number of strips.", strips.size(), 1);
    strips.recycle();

    // Ensure getWords() works.
    final Pixa words = baseApi.getWords();
    assertEquals("Found incorrect number of words.", words.size(), 1);
    words.recycle();

    // Ensure getConnectedComponents() works.
    final Pixa connectedComponents = baseApi.getConnectedComponents();
    assertTrue("Connected components not found.", connectedComponents.size() > 0);
    connectedComponents.recycle();

    // Iterate through the results.
    final ResultIterator iterator = baseApi.getResultIterator();
    String lastUTF8Text;
    float lastConfidence;
    int[] lastBoundingBox;
    Rect lastBoundingRect;
    int count = 0;
    iterator.begin();
    do {
      lastUTF8Text = iterator.getUTF8Text(PageIteratorLevel.RIL_WORD);
      lastConfidence = iterator.confidence(PageIteratorLevel.RIL_WORD);
      lastBoundingBox = iterator.getBoundingBox(PageIteratorLevel.RIL_WORD);
      lastBoundingRect = iterator.getBoundingRect(PageIteratorLevel.RIL_WORD);
      count++;
    } while (iterator.next(PageIteratorLevel.RIL_WORD));
    iterator.delete();

    assertEquals("Found incorrect number of results.", count, 1);
    assertEquals("Found an incorrect result.", lastUTF8Text, outputText);
    assertTrue("Result was not high-confidence.", lastConfidence > 80);
    assertTrue("Result bounding box not found.", lastBoundingBox[2] > 0 && lastBoundingBox[3] > 0);

    boolean validBoundingRect =
        lastBoundingRect.left < lastBoundingRect.right
            && lastBoundingRect.top < lastBoundingRect.bottom;
    assertTrue("Result bounding box Rect is incorrect.", validBoundingRect);

    // Attempt to shut down the API.
    baseApi.end();
    bmp.recycle();
  }